5年前我在学习C ++时,其中一项任务是
创建一个程序,使用公式 C°x 9/5 + 32 = F°
,根据摄氏度输入计算华氏温度
我们的第一个版本是这样的
int main()
{
float celsius;
cout << "Enter Celsius temperature: ";
cin >> celsius;
cout << "Fahrenheit: " << celsius * (9.0 / 5) + 32 << endl;
return 0;
}
一位同学指出,我们没有明确告知输出结果,导致
int main()
{
float celsius;
cout << "Enter Celsius temperature: ";
cin >> celsius;
celsius * (9.0 / 5) + 32;
return 0;
}
我将此用作轶事:在指定要求时始终彻底
最近我一直想知道这段代码是否确实符合要求。
编译器在死代码消除期间不会排除celsius * (9.0 / 5) + 32;
部分吗?代码是在Visual Studio 2010中编译的,没有任何特定的编译器选项。
查看Visual Studio反汇编语句似乎没有生成任何代码,但是float celsius;
语句也没有。
7: float celsius;
8: cout << "Enter Celsius temperature: ";
push offset string "Enter Celsius temperature: " (01368B30h)
mov eax,dword ptr [_imp_?cout@std@@3V?$basic_ostream@DU?$char_traits@D@std@@@1@A (0136C098h)]
push eax
call std::operator<<<std::char_traits<char> > (01361370h)
add esp,8
9: cin >> celsius;
mov esi,esp
lea eax,[celsius]
push eax
mov ecx,dword ptr [_imp_?cin@std@@3V?$basic_istream@DU?$char_traits@D@std@@@1@A (0136C09Ch)]
call dword ptr [__imp_std::basic_istream<char,std::char_traits<char> >::operator>> (0136C0A0h)]
cmp esi,esp
call __RTC_CheckEsp (0136114Fh)
10: celsius * (9.0 / 5) + 32;
11: return 0;
xor eax,eax
答案 0 :(得分:8)
是的,看起来编译器优化了该语句。我打赌,如果您使用volatile float celsius;
,您会看到代码!
答案 1 :(得分:3)
如果没有使用计算结果(并且编译器可以证明这个),那么它将完全消除计算。 至少如果它是一个非垃圾编译器。
未经优化的调试版本当然是例外。