Разве нельзя инициализировать более 4 переменных одновременно? - PullRequest
2 голосов
/ 07 марта 2020
void main() {
    int a, b, c, d, e = 0;

    printf("\n%d", a);
    printf("\n%d", b);
    printf("\n%d", c);
    printf("\n%d", d);
    printf("\n%d", e);
}

вывод:

16
0
10818512
0
0

По некоторым причинам a всегда равен 16, хотя я инициализирую его как 0.

c с другой стороны, всегда изменяется его значение при повторном запуске кода. Почему это происходит?

Я чувствую, что упускаю что-то важное здесь.

Ответы [ 4 ]

3 голосов
/ 07 марта 2020

Только e инициализируется нулем. Все остальные переменные не инициализированы. См. Инициализация для объяснения

Инициализация
Для каждый декларатор, инициализатор, если не опущен, может быть один из следующего:

...

Неявная инициализация
Если инициализатор не предусмотрен:

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

Итак, если вы хотите инициализировать каждую переменную, вы должны предоставить инициализатор для каждого из них, например

int a = 0, b = 0, c = 0, d = 0, e = 0;
2 голосов
/ 07 марта 2020

a всегда равно 16, хотя я инициализирую его 0

Нет, вы этого не сделаете.

Эта строка

int a, b, c, d, e = 0;

инициализирует только e до 0.

Все остальные переменные остаются неинициализированными. Печать может вызвать неопределенное поведение. Напечатанные значения - это просто что-то, мусор, неопределенные.

Для инициализации a также выполните

int a = 0, b, c, d, e = 0;

Разве нельзя инициализировать более 4 переменных одновременно?

Невозможно (явно) инициализировать более одной переменных одновременно.

1 голос
/ 07 марта 2020

Все переменные в этом объявлении

int a, b, c, d, e = 0;

не инициализируются, кроме последней переменной e. Они были бы инициализированы нулями, если бы имели длительность хранения c. Однако эти переменные являются локальными переменными с автоматическим c сроком хранения и не инициализируются компилятором неявным образом.

Вам необходимо инициализировать каждую переменную, например

int a = 0, b = 0, c = 0, d = 0, e = 0;

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

struct { int a, b, c, d, e; } s = { 0 };

. В этом случае все переменные будут инициализированы нулем. Вы можете получить к ним доступ, например, s.a или s.b и т. Д.

Вот демонстрационная программа.

#include <stdio.h>

int main(void) 
{
    struct { int a, b, c, d, e; } s = { 0 };

    printf( "s.a = %d\n", s.a );
    printf( "s.b = %d\n", s.b );
    printf( "s.c = %d\n", s.c );
    printf( "s.d = %d\n", s.d );
    printf( "s.e = %d\n", s.e );

    return 0;
}

Ее вывод

s.a = 0
s.b = 0
s.c = 0
s.d = 0
s.e = 0
1 голос
/ 07 марта 2020

Все ваши переменные, кроме e, неинициализированы. Вам необходимо явно инициализировать их, используя оператор присваивания =:

int a = 0, b = 0, c = 0, d = 0, e = 0;
...

Ваши операторы printf (), за исключением оператора, включающего e, вызывают неопределенное поведение.

Вы не должны полагаться на неопределенное поведение. Может показаться, что он работает нормально, а может и нет.

...