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.
Комментариев нет:
Отправить комментарий