话说发现自己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
木想到,码了这么久代码,还会犯那么“高级”的错误。看到这个回答,彻底笑抽了。