奇怪的编译器行为

Strange compiler behavior

本文关键字:编译器      更新时间:2023-10-16

我刚用g++编译一个小C++程序时遇到了一个奇怪的行为(4.6.3)。比较两个float celsius并测试:

#include <iostream>
using namespace std;
int main () {
    float fahrenheit = 0;
    float celsius = 0;
    float test = 0;
    cout << "Temperature in °F: " << endl;
    cin >> fahrenheit;
    celsius = 5 / 9 * (fahrenheit - 32);
    test =  5 * (fahrenheit - 32) / 9;
    cout << "nWrong:t" << fahrenheit << " °F = " << celsius << " °C" << endl;
    cout << "Correct:" << fahrenheit << " °F = " << test << " °C" << endl;
}

我用"g++test.cpp-o测试"编译了这个。

这是程序的输出:

$ ./test
Temperature in °F: 
1000
Wrong:  1000 °F = 0 °C
Correct:1000 °F = 537.778 °C

有人能向我解释一下为什么g++(可重复地)将celsius计算为0,而test包含正确的解决方案吗?这与一些优化有关吗,尽管我没有为此设置任何参数?或者这在某种程度上真的是一个bug?

5 / 9=0

0*anything=0

当你除以整数时,你得到一个整数。你可以说5.0 / 9,它应该好多了。

当你在写代码时,没有得到你期望的结果,你的第一个倾向应该是"我做错了什么?"而不是"编译器做错了什么吗?"

它会帮助你在大多数时候寻找正确的地方。