2015-03-28 5 views
6

Ich konnte immer noch nicht klar verstehen, ob der Ausdruck x ^= y ^= x ^= y; gültig in C++ 11 (wie sie in diesem thread sagen) oder es zu undefiniertem Verhalten führt?Tausche Integer über XOR in einer Zeile. Ist es in C++ 11 wirklich erlaubt?

Die durch den Link angeführten Gründe scheinen überzeugend, aber Klappern wirft eine warning:

Warnung: unsequenced Modifikation und den Zugriff auf 'x' [-Wunsequenced]

Außerdem, wenn beide Versionen :

x ^= y ^= x ^= y; // (1) 
x = x^(y = y^(x = (x^y))); // (2) 

als gleichwertig betrachtet (und gut definiert in C++ 11), warum gibt es unterschiedliche Ergebnisse (first, second)?

Darüber hinaus sollte beachtet werden, dass der gcc gibt warning über Sequenzpunkt nur auf der zweiten Version des Codes.

+2

Nein, es ist nicht gut definiert. Die Analyse ist sehr ähnlich zu der von 'i + = ++ i + 1' in [dieser Frage] (http://stackoverflow.com/questions/24194076/in-c11-does-ii-1-exhibit-undefined- Verhalten). –

+0

diese Versionen sind überhaupt nicht äquivalent. – UmNyobe

+1

Siehe http://stackoverflow.com/questions/29313902/sequence-point-within-assignment-operators – Lingxi

Antwort

11

Der Zuweisungsoperator (=) und die zusammengesetzten Zuweisungsoperatoren alle Gruppe von rechts nach links. [..]
Das Verhalten eines Ausdrucks der Form E1 op = E2 entspricht E1 = E1 op E2 mit der Ausnahme, dass E1 nur einmal ausgewertet wird.

So kann Ihr Code entspricht

x = x^(y ^= (x ^= y))); 

... mit x in x = x ... nur einmal ausgewertet. Leider ist für xor's die Auswertung der Operanden nicht sequentiell. I.e.

Sofern nicht anders angegeben, sind die Auswertungen der Operanden der einzelnen Operatoren und der Teilausdrücke der einzelnen Ausdrücke nicht sequentiell.

gilt. Aber jetzt haben wir ein Problem:

x = x^(y ^= (x ^= y))); 
//  *   ****** 
//  |   | 
//  |   Side effect 
//  Value computation 

Die Wertberechnung (die in der Einzahl Auswertung von x für die beiden linken x impliziert ist) und die Nebenwirkung sind unsequenced WRT einander, damit wir UB induzieren:

Wenn eine Nebenwirkung auf ein skalares Objekt ist unsequenced relativ zu entweder ein weiterer Nebeneffekt auf demselben Skalar-Objekt oder ein Wertberechnungs den Wert des gleichen skalaren Objekt verwendet wird, ist das Verhalten undefiniert.

+1

aber es antwortet immer noch nicht wirklich, wenn die erste Version UB ist oder nicht – sp2danny

+0

@ sp2danny Haben Sie meine Antwort gelesen? – Columbo

+0

Ich beginne mich in Richtung beider Konstrukte zu orientieren, die UB sind – sp2danny

Verwandte Themen