Поиск по сайту:

Учебник по программированию на C для Linux, часть 17: инициализация переменных


Инициализация переменных — это то, чем мы до сих пор занимались в этой продолжающейся серии руководств по программированию на C, но мы никогда не обсуждали это явно. Что ж, теперь это изменилось, и здесь мы подробно обсудим инициализацию переменных.

Так что же такое инициализация? Что ж, как следует из названия, когда значение присваивается переменной в первый раз, это называется инициализацией переменной. Например:

int a = 1;

Теперь это также известно как явная инициализация. Причина в том, что даже если вы не присвоите значение переменной, такой как a, и попытаетесь напечатать значение переменной, вы увидите какое-то случайное значение.

Например, рассмотрим следующий код:

#include <stdio.h>

int main()
{
int a;
printf("a = %d", a);

return 0;
}

Когда я выполнил этот код, я получил a как 0. Но это не всегда будет так, потому что автоматические переменные, такие как a, инициализируются случайными значениями в отсутствие явной инициализации. Вот почему всегда предлагается явно инициализировать их значением, скажем, 0, чтобы избежать ошибочного использования значения мусора.

Обратите внимание, что это единственные автоматические переменные, которые получают значение мусора, если их не инициализировать. Статические и глобальные переменные получают 0 в качестве своего начального значения, даже если вы явно не присваиваете значение. Вот пример:

int x;

void func();
{
static int b;

//statements

b++;
}

int main()
{
int a;

//statements

func();
return 0;

В приведенном выше коде гарантируется, что переменные x и b будут инициализированы равными 0, но нет гарантии того, какое значение будет содержать переменная a.

Двигаясь дальше, вы можете только инициализировать статические и глобальные переменные с постоянными значениями. Другими словами, невозможно присвоить значения статическим и глобальным переменным с точки зрения других переменных.

Вот пример:

#include <stdio.h>

int k;
int x = k;

void func()
{
int z = 2;

static int b = z;
b++;
}

int main()
{
int a;
printf("a = %d", a);

func();
return 0;
}

Когда я скомпилировал этот код, я получил следующие ошибки:

main.c:12:9: error: initializer element is not constant
 int x = k;
         ^
main.c: In function ‘func’:
main.c:18:20: error: initializer element is not constant
     static int b = z;
                    ^

Поскольку x является глобальным, а b статическим, вы можете видеть, что компилятор ясно говорит, что элементы инициализатора не являются постоянными. Таким образом, это подтверждает тот факт, что для инициализации глобальных и статических переменных можно использовать только константы.

Двигаясь дальше, массивы также можно инициализировать по-разному. Например, один из способов инициализации:

int arr[] = {1,2,3,4,5};

Таким образом, размер массива вычисляется путем подсчета количества элементов инициализатора. Таким образом, в этом примере массив arr имеет размер 5 со значениями 1-5 в качестве его элементов (в указанном порядке).

Далее, скажем, размер массива предопределен, и вы инициализируете массив, используя описанный выше метод. Вот пример:

int arr[5] = {1,2,3,4};

Затем, в этом случае, первые четыре элемента будут выбраны из списка, представленного в {}, а последний элемент будет равен 0. Так что да, таким образом вы можете указать меньше элементов, чем размер массива, и пусть компилятор позаботится обо всем остальном, инициализируя их 0.

Например, следующая программа:

#include <stdio.h>

int main()
{
int arr[10] = {1,2,3,4,5};
int i = 0;

for(i=0;i<10;i++)
printf("%d ", arr[i]);

return 0;
}

производит следующий вывод:

1 2 3 4 5 0 0 0 0 0

В этом уроке мы немного обсудили инициализацию переменных. Я рекомендую вам попробовать примеры, а также концепции, обсуждаемые здесь. Если у вас есть какие-либо сомнения или вопросы, вы можете оставить комментарий ниже.