Warum gibt der Ausdruck a = a + b - (b = a) eine Sequenzpunktwarnung in c ++ aus?
Es folgt der Testcode:
int main()
{
int a = 3;
int b = 4;
a = a + b - (b = a);
cout << "a :" << a << " " << "b :" << b << "\n";
return 0;
}
Wenn Sie dies kompilieren, erhalten Sie die folgende Warnung:
> $ 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]
Warum kann die Operation undefiniert sein?
Nach meinem Verständnis zunächst der Unterausdruck(b = a)
sollte aufgrund der höheren Priorität von () ausgewertet werden, sodass b = a gesetzt wird. Da dann '+' und '-' die gleiche Priorität haben, würde der Ausdruck linksassoziativ ausgewertet. Somit,a + b
sollte als nächstes ausgewertet werden, und schließlich das Ergebnis von(b = a)
sollte von subtrahiert werdena + b
. Ich kann keine sehenSequenzpunktregel hier verletzt werden.