Подтвердить что ты не робот

Булева инициализация массива в C

Я наткнулся на какое-то странное поведение, для которого я не мог найти информацию в Интернете. Если я инициализирую логический массив следующим образом:

 bool condition[10] = {true,[5]=true};

Я получаю вывод, который я ожидаю, первое и шестое значения истинны, а другие - false. Но если я напишу следующий фрагмент:

 bool condition[10] = {true,condition[5]=true};

Сначала я получаю первое, второе и шестое значения. Я предполагаю, что это своего рода поведение undefined, но я хотел бы, чтобы кто-то более осведомленный, чем я, объяснил мне, что происходит.

Я компилирую с дополнительными предупредительными флагами, используя GCC и "-std = gnu99", и я не получаю никаких ошибок.

4b9b3361

Ответ 1

C говорит, что:

(C11, 6.7.9p23) "Оценки выражений списка инициализации неопределенно секвенированы относительно друг друга, и, следовательно, порядок, в котором происходят какие-либо побочные эффекты, не определен".

и в C99

(C99, 6.7.8p23) "Порядок, в котором происходят какие-либо побочные эффекты среди выражений списка инициализации, не указан".

Это означает, что объявление

    bool condition[10] = {true,condition[5]=true};

может иметь такое же поведение:

    bool condition[10] = {true, 1};

или

    bool condition[10] = {true, 1, [5] = true};

выполняется ли оценка condition[5] = true до или после инициализации 0 элементов массива.

EDIT: есть случай неуказанного порядка инициализации элементов массива в отчете об ошибках # 208. Случай отличается, потому что в примере DR есть два инициализатора для одного элемента.

http://www.open-std.org/jtc1/sc22/wg14/www/docs/9899tc1/n32074.htm

int a [2] = {f (0), f (1), [0] = f (2)};

Цель WG14 заключалась в том, что вызов f (0) может, но не обязательно, выполняться, когда a инициализируется. Если вызов выполнен, порядок, в котором встречаются f (0) и f (2), не указан (как и порядок, в котором f (1) происходит относительно обоих). Независимо от того, сделан ли вызов, результат f (2) используется для инициализации [0].

Ответ 2

Это приятная маленькая головоломка. Я думаю, что это получилось, но больше объяснений, вероятно, поможет. Я думаю, что условие [5] = true не является назначенным инициализатором. Это выражение, которое оценивается как истинное. Поскольку это выражение находится во втором месте, true присваивается условию [1]. Кроме того, в качестве побочного эффекта выражения условие [5] устанавливается равным true.