Определить целое число (int); Какое значение по умолчанию?

int i;
int data[5] = {0};
data[0] = i;

Какое значение в данных [0]?

Кроме того, каков смысл этой строки?

if (!data[0]) { ... }

Ответ 1

В большинстве случаев нет значения по умолчанию для объекта int.

Если вы объявляете int i; в качестве (нестатической) локальной переменной внутри функции, она имеет неопределенное значение. Он не инициализирован, и вы не можете использовать его, пока не напишите ему действительное значение.

Хорошая привычка вступать в явную инициализацию любого объекта, когда вы его объявляете.

Ответ 2

Это зависит от того, где написан код. Рассмотрим:

int i;
int data[5] = {0};

void func1(void)
{
    data[0] = i;
}

void func2(void)
{
    int i;
    int data[5] = {0};
    data[0] = i;
    ...
}

Значение, присвоенное data[0] в func1(), полностью детерминировано; он должен быть равен нулю (если никакие другие назначения не помешали значениям глобальных переменных i и data).

В отличие от этого, значение, установленное в func2(), полностью неопределенно; вы не можете достоверно указать, какое значение будет присвоено data[0], потому что в функции i не было надежно присвоено значение. Вероятно, это будет значение, которое было в стеке от некоторого предыдущего вызова функции, но это зависит как от компилятора, так и от программы и даже не "определено в реализации"; это чистое поведение undefined.

Вы также спрашиваете: "В чем смысл этого?"

if (!data[0]) { ... }

Оператор '!' выполняет логическую инверсию значения, к которому он применяется: он сопоставляет ноль к единице и сопоставляет любое ненулевое значение нулю. Общее условие оценивается как true, если выражение оценивает ненулевое значение. Итак, если data[0] равно 0, !data[0] отображается в 1 и выполняется код в блоке; если data[0] не равно 0, !data[0] отображается в 0, а код в блоке не выполняется.

Это обычно используемая идиома, потому что она более кратка, чем альтернатива:

if (data[0] == 0) { ... }

Ответ 3

Если целое число не инициализировано, его значение undefined соответствует C

Ответ 4

Поскольку вы включили ={0};, весь массив заполняется нулями. Если это определено вне любой функции, оно будет инициализировано нулями даже без инициализатора. if (!data[x]) эквивалентно if (data[x] == 0).

Ответ 5

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

Ответ 6

//Файл 'a.c'

   #include <stdio.h> 

   void main()
    {
            int i, j , k;
            printf("i = %i j = %i k = %i\n", i, j, k);
    }

//результаты тестов

> $ gcc a.c 
> $ ./a.out 
> i = 32767 j = 0 k = 0