Почему программа скомпилированная при помощи Clang и GCC ведет себя по-разному?
Вопрос к знатокам компиляторов Clang и GCC. Сложилась следующая ситуация. Придумал реализацию функции swap на языке C без использования дополнительной переменной и в одну строку. И столкнулся вот с чем: если компилировать исходник, используя gcc, то программа не работает, так как я планировал, но если скомпилировать посредством Clang, то программа работает, как задумывалось, то есть меняет значения местами.
Код в исходнике "prog.c":
#include <stdio.h>
void SWAP(int *a, int *b) {
*b = *a + ((*a = *b) - *a);
}
int main() {
int a = 5, b = 6;
printf("%d %d\n", a, b);
SWAP(&a, &b);
printf("%d %d\n", a, b);
return 42;
}
Компилирую при помощи gcc: "gcc -o prog prog.c" - получаю: a и b равны 6. Компилирую при помощи clang: "clang -o prog prog.c" - значения a и b меняются местами. Собственно, хотел бы поподробнее узнать, почему так происходит