Инициализация массива нулей - программирование
Подтвердить что ты не робот

Инициализация массива нулей

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

int A[5]; // Entries remain uninitialized
int B[5]= { 0 }; // All entries set to zero

Но гарантируется ли это (ниже)?

int C[5]= { }; // All entries set to zero
4b9b3361

Ответ 1

Пустая фиксированная инициализация выполняет агрегацию-инициализацию массива: это приводит к нулевой инициализации элементов int.

Да, это гарантировано.

Ответ 2

Да, согласно правилу агрегатная инициализация, он гарантировал (что все элементы массива C будут value-initialized, т.е. с нулевой инициализацией до 0 в этом случае).

(акцент мой)

Если количество предложений инициализатора меньше количества элементов and bases (since C++17) или список инициализаторов полностью пуст, остальные члены and bases (since C++17) инициализируются by their default initializers, if provided in the class definition, and otherwise (since C++14) пустыми списками в соответствии с с обычными правилами инициализации списка (который выполняет инициализацию значений для типов неклассов и неагрегатных классов с конструкторами по умолчанию и агрегатной инициализацией для агрегатов).


PS:

int A[5]; // Entries remain uninitialized

"оставаться неинициализированным" может быть неточным. Для int A[5]; все элементы A будут инициализированы по умолчанию. Если A является статическим или поточно-локальным объектом, элементы будут с нулевой инициализацией до 0, в противном случае ничего не будет сделано, ll - неопределенные значения.

Ответ 3

Фактически, когда вы говорите int A[5] = { 0 }; вы говорите: Инициализируйте первый элемент до нуля. Все остальные позиции инициализируются нулем из-за агрегационной инициализации.

Эта строка является реальной ответственностью за то, что ваш массив заполнен нулями: int A[5] = { };

Вот почему, если вы используете int A[5] = { 1 };, у вас будет только первая позиция, инициализированная 1.