Определить целое число (int); Какое значение по умолчанию? - PullRequest
12 голосов
/ 26 декабря 2010
int i;
int data[5] = {0};
data[0] = i;

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

Кроме того, что означает эта строка?

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

Ответы [ 6 ]

20 голосов
/ 26 декабря 2010

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

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

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

8 голосов
/ 26 декабря 2010

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

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. Вероятно, это будет значение, которое было в стеке от какого-то предыдущего вызова функции, но оно зависит как от компилятора, так и от программы и даже не «определено реализацией»; это чисто неопределенное поведение.

Вы также спрашиваете «Что это значит?»

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

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

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

if (data[0] == 0) { ... }
4 голосов
/ 26 декабря 2010

Если целое число не инициализировано, его значение не определено согласно C

3 голосов
/ 27 января 2015

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

3 голосов
/ 26 декабря 2010

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

1 голос
/ 26 ноября 2012

// Файл '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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...