int i;
int data[5] = {0};
data[0] = i;
Какое значение в данных [0]?
Кроме того, каков смысл этой строки?
if (!data[0]) { ... }
int i;
int data[5] = {0};
data[0] = i;
Какое значение в данных [0]?
Кроме того, каков смысл этой строки?
if (!data[0]) { ... }
В большинстве случаев нет значения по умолчанию для объекта int.
Если вы объявляете int i; в качестве (нестатической) локальной переменной внутри функции, она имеет неопределенное значение. Он не инициализирован, и вы не можете использовать его, пока не напишите ему действительное значение.
Хорошая привычка вступать в явную инициализацию любого объекта, когда вы его объявляете.
Это зависит от того, где написан код. Рассмотрим:
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) { ... }
Если целое число не инициализировано, его значение undefined соответствует C
Поскольку вы включили ={0};, весь массив заполняется нулями. Если это определено вне любой функции, оно будет инициализировано нулями даже без инициализатора. if (!data[x]) эквивалентно if (data[x] == 0).
если целое объявлено глобально, тогда оно инициализируется автоматически с нулем но если он локальный, то содержит значение мусора до тех пор, пока ему не будет задано какое-то значение
//Файл '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