CodeBlocks中的奇怪逻辑
Weird logic in CodeBlocks
#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;
}
上面的代码应该打印所有三个asd1
,asd2
,asd3
。正如预测的那样,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 建议的那样。尽管优化设置似乎可以"修复"这种特殊情况,但可能还有其他情况没有,或者未优化的代码产生了所需的结果,但优化的代码没有。
- 为什么这种情况发生在CodeBlocks上?
- fopen_s 未在 scope(C++:codeblocks ) 中声明
- CodeBlocks使用哪个版本的c++
- CodeBlocks,C++,mingw-w64编译器,Windows 10,错误:对`DAQmxCreateTask&
- Valgrind on codeblocks (linux)
- Bitdefender指责病毒,同时使用CodeBlocks编译c ++源代码
- 使用 CodeBlocks + GCC 构建的可执行文件是否可以在任何 Windows 上运行?
- CodeBlocks和Visual Studio 2019中的不同结果
- 如何在Windows上的CodeBlocks中使用libpng
- C++ 当我使用 iostream 时无法编译(Linux,CodeBlocks)
- CodeBlocks成功地编译了,但海湾合作委员会失败了,为什么
- 代码在CodeBlocks中运行良好,但是当我将其上传到Google Kickstart竞赛时,我会得到一个重新播放
- C++ MinGW GCC CodeBlocks静态链接
- 我如何在CodeBlocks中获得按下的键
- ( __ printf __ ) 在 DLL (programfiles(x86)\codeblocks\mingw
- TensorFlow with c++, codeblocks
- CodeBlocks 13.12 使用哪个 c++ 版本
- CodeBlocks字符串输出定界线
- 我的C 程序在CodeBlocks中提供了正确的结果,但在Visual Basic 2005 Express Edi
- 错误:LD返回1个退出状态-CodeBlocks