Предположительно «умный» (но на самом деле неэффективный) способ замены двух целочисленных переменных, вместо использования временного хранения, часто включает в себя строку: Существуют ли точки последовательности в выражении a^= b^= a^= b, или она не определена?
int a = 10;
int b = 42;
a ^= b ^= a ^= b; /*Here*/
printf("a=%d, b=%d\n", a, b);
Но я задаюсь вопросом, составные операторы присваивания, как ^=
являются а не точки последовательности, не так ли? Означает ли это, что это на самом деле неопределенное поведение?
Если вы пишете код, который трудно сказать, что происходит, спросите себя, есть ли более простой способ, который может понять будущий разработчик? –
Обратите внимание, что если вы видели это в коде на C++, у C++ есть разные правила для операторов присваивания, которые допускают определенные конструкции (я не уверен в этом), которые не определены в C. – hvd
Возможный дубликат [Sequence Point - Xor Swap on Array получить неправильный результат] (http://stackoverflow.com/questions/9958514/sequence-point-xor-swap-on-array-get-wrong-result) –