Рассмотрим следующую программу, которая явно глючит:
#include <cstdio>
double test(int n) {
if (n % 2 == 0)
return 0.0;
// warning: control reaches end of non-void function
}
int main() {
printf("%.9lf\n", test(0));
printf("%.9lf\n", test(1));
printf("%.9lf\n", test(2));
printf("%.9lf\n", test(3));
return 0;
}
При компиляции с g ++ версии 4.2.4 (Ubuntu 4.2.4-1ubuntu4) в 32-разрядной версии Ubuntu 8.04 выдает следующий вывод:
0.000000000
nan
0.000000000
nan
При компиляции с g ++ версии 4.4.3 (Ubuntu 4.4.3-4ubuntu5) на 64-битной Ubuntu 10.04 выдает следующий вывод:
0.000000000
0.000000000
0.000000000
0.000000000
Кажется, что старый компилятор выполняет некоторую дополнительную работу, чтобы вернуть NaN вместо мусора, в то время как более новый компилятор просто возвращает все, что есть в памяти. Что именно вызывает эту разницу в поведении и как ее контролировать и сделать ее предсказуемой в разных версиях компилятора?
РЕДАКТИРОВАТЬ: Извините, что не упомянул неопределенное поведение ранее. Я знаю, что разница заключается в том, что эта программа имеет неопределенное поведение. Что я хотел бы знать , почему предыдущая версия gcc, кажется, прилагает некоторые усилия и создает код, который последовательно возвращает NaN и , когда это поведение изменилось на то, которое наблюдалось в последней версии gcc , Кроме того, под «предсказуемым» я подразумевал не то, как писать хорошие программы на C ++, а то, как управлять этим поведением gcc (возможно, с некоторыми параметрами командной строки?).