Стандарт C ++ не определяет, в каком порядке вычисляются подвыражения полного выражения, за исключением некоторых операторов, которые вводят порядок (оператор запятой, тернарный оператор, логические операторы короткого замыкания) и того факта, что выражения, которые составляющие аргументы / операнды функции / оператора все оцениваются перед самой функцией / оператором.
GCC не обязан объяснять вам (или мне), почему он хочет заказать их, как он делает. Это может быть оптимизация производительности, возможно, потому что код компилятора получился на несколько строк короче и проще, возможно, потому что один из кодировщиков mingw лично ненавидит вас и хочет убедиться, что если вы сделаете предположения, которые не т гарантируется стандартом, ваш код идет не так. Добро пожаловать в мир открытых стандартов: -)
Изменить, чтобы добавить: litb подчеркивает (не) определенное поведение ниже. Стандарт гласит, что если вы изменяете переменную несколько раз в выражении, и если для этого выражения существует действительный порядок вычисления, такой, что переменная изменяется несколько раз без точки последовательности между ними, то выражение имеет неопределенное поведение. Это не применимо здесь, потому что переменная модифицируется при вызове функции, и в начале любого вызова функции есть точка последовательности (даже если компилятор вставляет ее в строку). Однако, если вы ввели код вручную:
std::cout << pow(x++,3) << endl << pow(x++,3) << endl << pow(x++,3) << endl;
Тогда это было бы неопределенным поведением. В этом коде допустимо, чтобы компилятор вычислял все три подвыражения "x ++", затем три вызова pow, а затем начал различные вызовы operator<<
. Поскольку этот порядок действителен и не имеет точек последовательности, разделяющих модификацию x, результаты полностью не определены. В вашем фрагменте кода не указан только порядок выполнения.