{0}
- допустимый инициализатор для любого (завершенного объекта) типа, как на C, так и на C ++. Это обычная идиома, используемая для инициализации объекта ноль (читайте дальше, чтобы узнать, что это значит).
Для скалярных типов (арифметических и указательных типов) фигурные скобки не нужны, но они явно разрешены. Цитируя N1570 черновик стандарта ISO C, раздел 6.7.9:
Инициализатор для скаляра должен быть одним выражением, необязательно заключенным в фигурные скобки.
Инициализирует объект нулем (0
для целых чисел, 0.0
для чисел с плавающей запятой, нулевой указатель для указателей).
Для нескалярных типов (структур, массивов, объединений) {0}
указывает, что первый элемент объекта инициализируется нулем. Для структур, содержащих структуры, массивы структур и т. Д., Это применяется рекурсивно, поэтому первый скалярный элемент устанавливается в ноль, в зависимости от типа. Как и в любом инициализаторе, любые не указанные элементы устанавливаются в ноль.
Промежуточные скобки ({
, }
) могут быть опущены; например, оба они действительны и эквивалентны:
int arr[2][2] = { { 1, 2 }, {3, 4} };
int arr[2][2] = { 1, 2, 3, 4 };
, поэтому вам не нужно писать, например, { { 0 } }
для типа, первый элемент которого не является скалярным.
Так вот:
some_type obj = { 0 };
- это сокращенный способ инициализации obj
в ноль, означающий, что каждый скалярный подобъект obj
установлен в 0
, если это целое число, 0.0
, если это с плавающей точкой, или нулевой указатель если это указатель.
Правила для C ++ аналогичны.
В вашем конкретном случае, поскольку вы присваиваете значения sexi.cbSize
и т. Д., Ясно, что SHELLEXECUTEINFO
является типом структуры или класса (или, возможно, объединением, но, вероятно, нет), поэтому не все это применяется, но, как я уже сказал, { 0 }
- это распространенная идиома, которую можно использовать в более общих ситуациях.
Это , а не (обязательно) эквивалентно использованию memset
для установки представления объекта равным нулю. Ни с плавающей точкой 0.0
, ни нулевой указатель не обязательно представлены как все-бит-ноль, а инициализатор { 0 }
не обязательно устанавливает байты заполнения в какое-либо конкретное значение. Однако в большинстве систем он может иметь такой же эффект.