a^=b^=a^=b;
, вероятно, вылетает, потому что вызывает страшное неопределенное поведение . Нарушаемое им правило состоит в том, что он дважды модифицирует a
без промежуточной точки последовательности. Это можно исправить, вставив несколько точек последовательности - например, с помощью оператора запятой:
a ^= (b ^= a ^= b, b);`
Или, разбив его на несколько операторов:
b ^= a ^= b; a ^= b;
Тем не менее, это обычно плохой метод обмена переменных - некоторые другие ответы и комментарии адекватно объяснили, почему.