Ответ 1
Нет, функциональной разницы нет. Стандарт C позволяет исключить промежуточный {}
. В частности, форма { 0 }
является инициализатором, который может использоваться для всех типов данных.
В C-коде, который я анализирую, существует много многомерных (структурных) массивов, которые инициализируются с другим количеством фигурных скобок, например. {{0}}
или {{{0}}}
.
Однако замена их на {0}
также отлично работает.
Существует ли (функциональная) разница между использованием одного или нескольких наборов фигурных скобок ({}
)?
Нет, функциональной разницы нет. Стандарт C позволяет исключить промежуточный {}
. В частности, форма { 0 }
является инициализатором, который может использоваться для всех типов данных.
У вас есть два варианта: либо { 0 }
, который работает для любого типа агрегата или объединения, а ноль инициализирует каждый элемент или использует правильную форму, которая должна соответствовать всем членам правильно.
Чтобы повторить то, что уже сказал Дженс, {0}
работает для любого типа. Это "универсальный нулевой инициализатор" в C.
См. Проект C11, 6.7.9 Инициализация.
Итак, для инициализации 3D-массива можно использовать {0}
или {{{0}}}
. Лично я использовал бы {0}
, так как было бы легче печатать и читать и работать для каждого типа. Это означает, что все допустимые инициализации:
int main(void)
{
int x = {0,};
int *p = {0,};
int *q = {0};
int arr[3][3][3][3] = {0};
}
Что еще более важно, если у вас есть какой-то неизвестный/непрозрачный тип, например, из сторонних библиотек, то единственный переносимый способ
для их инициализации используется {0}
. Любой другой способ обнуления (например, использование memset()
или непосредственно some_type_t state = 0;
) потребует некоторых внутренних знаний о соответствующем типе и рисках, которые не переносятся.