Страницы

Поиск по вопросам

понедельник, 1 октября 2018 г.

Какое значение примет элемент n[1] после выполнения команд:

int i = 0, n[] = {7, 5, 3, 1}; for ( ; i<3; n[i++] = n[i]);
Дело в том, что два разных компилятора (Code Blocks и CppDroid) выдают два разных значения. В Code Blocks получается 5, а в CppDroid - 3. Так какой же ответ правильный? Проблема в одном из компиляторов, или само задание некорректно?


Ответ

По-моему, порядок вычисления выражения слева и выражения справа при выполнении присваивания не оговорен стандартом (порядок определяется конкретным компилятором).
Для C++11, раздел 5.17:
The assignment operator (=) and the compound assignment operators all group right-to-left. All require a modifiable lvalue as their left operand and return an lvalue referring to the left operand. The result in all cases is a bit-field if the left operand is a bit-field. In all cases, the assignment is sequenced after the value computation of the right and left operands, and before the value computation of the assignment expression. With respect to an indeterminately-sequenced function call, the operation of a compound assignment is a single evaluation
Поскольку итоговый результат вычисления зависит от порядка вычисления операндов, то и возникает undefined behavior.
Для C++17, раздел 5.18, порядок вычисления уже более строго определен:
The right operand is sequenced before the left operand.
Поэтому неопределенного поведения не должно возникать. И после выполнения цикла массив не изменится, поэтому n[1] равно 5.

Комментариев нет:

Отправить комментарий