Что было бы порядок оценки x = x ++ + ++ x; быть? [дубликат]

8
задан Community 23 May 2017 в 11:45
поделиться

4 ответа

Не указано, какой из аргументов + оценивается первым - но это и не важно, потому что в C и C++ модификация одного и того же объекта дважды без промежуточной точки следования является совершенно неопределенным поведением.

Здесь вы изменяете x три раза без промежуточной точки последовательности, так что вы уже на территории here be dragonnes ;)


Соответствующая часть стандарта C99 - "6.5 Expressions":

2 Between the previous and next точкой последовательности объект должен иметь его хранимое значение изменяется не более одного раза в результате оценки выражения. Более того, предыдущее значение должно быть считываться только для определения значения, которое будет сохранено.

и

3 Группировка операторов и операндов обозначается синтаксисом. За исключением случаев, указанных далее (для функции-вызова (), &&, ||, ?:, и операторов-запятых), порядок порядок оценки подвыражений и порядок возникновения побочных эффектов не определены.


Можно написать легальный код, демонстрирующий неопределенный порядок оценки - например:

#include <stdio.h>

int foo(void)
{
    puts("foo");
    return 1;
}

int bar(void)
{
    puts("bar");
    return 2;
}

int main()
{
    int x;

    x = foo() + bar();
    putchar('\n');

    return x;
}

(Не определено, получите ли вы на выходе foobar или barfoo).

14
ответ дан 5 December 2019 в 07:11
поделиться

Стандарт C++03 5.4

За исключением случаев, когда это указано, порядок порядок оценки операндов отдельных операторов и подвыражений отдельных выражений, и порядок в котором происходят побочные эффекты, является не определены.53) Между предыдущей и следующей точкой последовательности скалярный объект должен иметь свое хранимое значение изменяется не более одного раза в результате оценкой выражения. Более того, предыдущее значение должно быть только для определения значения которое будет сохранено. Требования этого параграфа должны быть выполнены для каждого допустимого упорядочения подвыражений полного выражения; в противном случае поведение не определено.

... следовательно, не определено и зависит от реализации.

4
ответ дан 5 December 2019 в 07:11
поделиться

Это не корректный оператор языка Си, поэтому говорить о порядке оценки не имеет смысла.

2
ответ дан 5 December 2019 в 07:11
поделиться

Стандарт C не гарантирует, что пост-инкремент действительно "произойдет" после пре-инкремента. Так что это неопределенное поведение.

3
ответ дан 5 December 2019 в 07:11
поделиться