CodeBlocks中的奇怪逻辑

Weird logic in CodeBlocks

本文关键字:CodeBlocks      更新时间:2023-10-16
#include <iostream>
#include <stdlib.h>
#include <iomanip>
using namespace std;
int main ()
{
    double x = 10000;
    double y = x*0.05;
    if(500 == 400+100)
        cout<<"asd1"<<endl;
    if(500 == 0.05*x)
        cout<<"asd2"<<endl;
    if(500 == y)
        cout<<"asd3"<<endl;
}

上面的代码应该打印所有三个asd1asd2asd3。正如预测的那样,Visual Studio打印了所有三个。但是,我的代码块不会。它没有打印asd2.我该如何解决这个问题?

将其更改为:

int main ()
{
    int x = 10000;
    int y = x*0.05;
    if(500 == 400+100)
        cout<<"asd1"<<endl;
    if(500 == int(0.05*x))
        cout<<"asd2"<<endl;
    if(500 == y)
        cout<<"asd3"<<endl;
}

并尝试阅读以下内容: http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html

迂腐的注释:Code::Blocks不是编译器,所以"奇怪的逻辑"不在其中,而是在你正在使用的任何编译器中(可能是gcc/g ++(。

在我的安装(4.8.4(中使用g ++版本,我可以通过编译来复制问题,而无需任何优化。使用任何 -O 选项都会产生预期的输出。

以下是我系统上g++ --version的完整输出:

g++ (i686-posix-sjlj-rev0, 由 MinGW-W64 项目构建( 4.8.4

以下版本的 g++ 提供了预期的输出,无论优化设置如何:

g++ (Debian 4.9.2-10( 4.9.2

所以:你可以看看你是否可以升级编译器,这可能会导致不同的行为,或者总是使用至少 -O 进行编译。在 Code::Blocks 中,这列在编译器设置、编译器标志、优化选项下,作为"优化生成的代码(提高速度("。任何优化级别似乎都能提供所需的输出,甚至针对大小而不是速度进行优化。

此外,正如 user4581301 所评论的那样,您通常希望避免对浮点数执行精确的相等性测试,而是测试该值是否在特定范围内。或者,在比较之前将结果显式转换为整数类型,如 Humam Helfawi 建议的那样。尽管优化设置似乎可以"修复"这种特殊情况,但可能还有其他情况没有,或者未优化的代码产生了所需的结果,但优化的代码没有。