代码之乐!


话说发现自己CPP还有不少地方不懂,想直接看CPP Pimer后面那一部分,可是发现有些知识点和前面关联,木办法啊。
只好从头看一遍,刚好看到强制转换那一部分。码了如下代码:
#include <iostream>
using namespace std;


int main(int argc, char *argv[])
{
int i = 100;
double d = 1.12;
i *= d;
cout << i << endl;

i *= (int)d;
cout << i << endl;

i *= (static_cast<int>(d));
cout << i << endl;

return 0;
}
输出:
112
112
112


耶?咋回事,第一个可以理解,第二个,为啥 100 *= 1,输出112?(看我这么想,码农们,你们乐了没有。).......老子想不通啊!


到网上提问:




int ival = 100;
double dval = 1.12;


ival = ival * dval;
cout << ival << endl;
输出112。这个肯定


ival = ival * (int)dval;
cout << ival << endl;
输出100。这个可以理解。


可是为啥
ival *= (int)dval;
cout << ival << endl;
也是输出112,这个郁闷了?




可是他们下面输出的结果都是100,他们说是编译器问题,然后我试了C_FREE, VC6, VS2010结果发现结果一样。
有人说用下反汇编,....................俺这个非科班的苦逼木学过啊



过了几天,牛人出现,回答如下:


囧,,,大家不要一起拷入代码。。。。上面一部分和下面一部份分开拷。。。。


别上了LZ的当。。。。


第二段代码当然是100, 妥妥的,毫无疑问


但第一段结束的ival已经是112了,再乘以1,当然还是112





木想到,码了这么久代码,还会犯那么“高级”的错误。看到这个回答,彻底笑抽了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值