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