Ниже приведен тестовый код:
int main()
{
int a = 3;
int b = 4;
a = a + b - (b = a);
cout << "a :" << a << " " << "b :" << b << "\n";
return 0;
}
При компиляции это дает следующее предупреждение:
> $ g++ -Wall -o test test.cpp test.cpp: In function ‘int main()’:
> test.cpp:11:21: warning: operation on ‘b’ may be undefined
> [-Wsequence-point]
Почему операция может быть undefined?
По моему мнению, сначала подвыражение (b = a)
должно быть оценено из-за более высокого приоритета(), установив таким образом b = a. Тогда, поскольку "+" и "-" имеют одинаковый приоритет, выражение будет оцениваться лево-ассоциативно. Таким образом, a + b
следует оценивать следующим образом, и, наконец, результат (b = a)
следует вычесть из a + b
. Я не вижу здесь правила последовательности).