Я все еще не мог четко понять, является ли выражение x ^= y ^= x ^= y;
действительным в C++ 11 (как говорится в этом thread) или приводит к неопределенному поведению?Обмен целыми числами через XOR в одной строке. Действительно ли это разрешено в C++ 11?
Причина, по ссылке кажется убедительной, но лязг бросает warning:
предупреждения: unsequenced модификации и доступ к 'х' [-Wunsequenced]
Кроме того, если оба версий :
x ^= y ^= x ^= y; // (1)
x = x^(y = y^(x = (x^y))); // (2)
считаются эквивалентными (и хорошо определены в C++ 11), поэтому он дает различные результаты (first, second)?
Кроме того, следует отметить, что gcc дает warning о точке последовательности только на второй версии кода.
Нет, это не определено. Анализ очень похож на анализ 'i + = ++ i + 1' в [этот вопрос] (http://stackoverflow.com/questions/24194076/in-c11-does-ii-1-exhibit-undefined- поведение). –
эти версии не эквивалентны вообще. – UmNyobe
См. Http://stackoverflow.com/questions/29313902/sequence-point-within-assignment-operators – Lingxi