При использовании оптимизаций O2 и выше с gcc я получаю неожиданный вывод со следующим кодом.
#include <stdio.h>
int f ( int *a, float *b ) {
*a = 1;
*b = 0;
printf ( "%d ", *a );
return *a;
}
int main ( ) {
int i = 0;
printf ( "%d\n", f ( &i, &i ) );
}
Этот код обычно должен выводить «0 0», но вместо этого с -O2 выводится «1 0». Затем, если я удаляю printf из функции f, он просто печатает 1. Это тот же оператор printf, чей вывод был изменен линией печати.
Почему это происходит?
Также я знаю, что никогда не должен делать это, я просто хочу знать, почему это происходит.