В чем разница между этими двумя макросами?
#define swap(a, b) (((a) ^ (b)) && ((a) ^= (b) ^= (a) ^= (b)))
или
#define swap(a, b) (((a) ^ (b)) && ((b) ^= (a) ^= (b), (a) ^= (b)))
Я увидел второй макрос здесь, но не мог понять, почему он не был написан как первый. Есть ли специальная причина, по которой я пропустил?