返回信息流代码:
#include <iostream>
#include <cmath>
using namespace std;
int main(){
int N = 4;
for (int i = 1; i <N; i++){
int Q = pow(10, i);
cout<<Q<<endl;
}
}
在Clock::Block下编译结果:
10
99
1000
Process returned 0 (0x0) execution time : 0.142 s
Press any key to continue.
在VS 2013 下编译结果:
10
100
1000
请按任意键继续. . .
怎么回事???
这是一条镜像帖。来源:北邮人论坛 / cpp / #83437同步于 2014/10/19
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
为什么一简单代码在Clock::Block和VS下得到不同结果?
aName
2014/10/19镜像同步32 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
main函数本来应该返回int却没有return函数。这是undefined behaviour,意思就是可能发生任何事,从什么都不发生到机器冒烟都是可以的。
发现一个神奇的事情,这个运算 -std=c++11 输出的是99, 默认输出是100
【 在 nuanyangyang 的大作中提到: 】
: main函数本来应该返回int却没有return函数。这是undefined behaviour,意思就是可能发生任何事,从什么都不发生到机器冒烟都是可以的。
【 在 ashjn2011 的大作中提到: 】
: 发现一个神奇的事情,这个运算 -std=c++11 输出的是99, 默认输出是100
可以用-S选项看看输出的汇编吗?
或者用objdump -d看
gcc 4.8.2 -std=c++11 输出是100
【 在 nuanyangyang 的大作中提到: 】
:
: 可以用-S选项看看输出的汇编吗?
: 或者用objdump -d看
【 在 tonyjansan 的大作中提到: 】
: double 2 int丢精度了,对于整数pow返回取整最简单的做法是round一下
按IEEE754的规定,浮点数运算总是先把参数数转换成无限精度的数学概念上的数,然后进行数学运算,最后再转换回浮点数。其中10的2次方等于100,其中10和2都可以精确表示,计算结果100也可以精确地用100.0表示。当从浮点数转换到整数的时候,如果可以精确转换,C语言也是要精确转换的。这中间的转换只有不能精确转换的时候才会有rounding之类的问题,但这个程序是不可能出现的。
所以我真的很好奇编译器的行为了。
【 在 q397273499 的大作中提到: 】
: g++ 4.8.2 表示
: 10
: 100
: ...................
是在Linux下运行的?反正我在Clock::Block下是输出99(之前都用VS,刚接触Clock::Block,不知道是不是哪里设置得不对~)