Non riesco ancora a capire se l'espressione x ^= y ^= x ^= y;
valida in C++ 11 (come si dice in questo thread) o che porti a un comportamento non definito?Scambia gli interi tramite XOR in una riga singola. È davvero permesso in C++ 11?
Le ragioni addotte dal collegamento sembrano convincenti, ma clang getta un warning:
avvertimento: la modifica non in sequenza e l'accesso a 'x' [-Wunsequenced]
Del resto, se entrambe le versioni :
x ^= y ^= x ^= y; // (1)
x = x^(y = y^(x = (x^y))); // (2)
considerato equivalente (e ben definito in C++ 11), perché dà risultati diversi (first, second)?
Inoltre, si noti che gcc fornisce un warning sul punto di sequenza solo sulla seconda versione del codice.
No, non è ben definito. L'analisi è molto simile a quella di 'i + = ++ i + 1' in [questa domanda] (http://stackoverflow.com/questions/24194076/in-c11-does-ii-1-exhibit-undefined- comportamento). –
quelle versioni non sono affatto equivalenti. – UmNyobe
Vedere http://stackoverflow.com/questions/29313902/sequence-point-within-assignment-operators – Lingxi