Набор забавных малоизвестных особенностей C. Самый интересный пример там, на мой взгляд - следующие две функции:
void foo1(int *x, int *y, int *z) {
*x += *z;
*y += *z;
}
void foo2(int *x, int *y, int *z) {
int w = *z;
*x += w;
*y += w;
}
Если хотите - подумайте сами, почему компилятор генерирует более эффективный код для второй из них, foo2, перед тем, как прочитать ответ.
Правильный ответ: [Spoiler (click to open)]в первом случае компилятор не может исключить возможность того, что x==z.
Я также не знал, что в C99 есть ключевое слово restrict, которое решает эту проблему.