可能运行程序时,大家或多或少出现过编译器报这样的警告:
#include<iostream>
using namespace std;
int main()
{
int i=3;
double j=3.99;
i*=j;
cout<<i<<endl;//11
system("pause");
return 0;
}
warning C4244: “*=”: 从“double”转换到“int”,可能丢失数据,
实际上,上面语句
i*=j;
正确的执行顺序是:先将i隐式转换为double,然后与变量j相乘(3.99*3.0=11.97),相乘的结果又重新赋给int i(11),缺少了小数部分,也就是警告中的数据丢失。
再看下面的例子:
#include<iostream>
using namespace std;
int main()
{
int i=3;
double j=3.99;
i*=static_cast<int>(j);
cout<<i<<endl;//9
system("pause");
return 0;
}
这次执行,编译器不会报任何错误,因为用到了强制类型转换,强制类型转换关闭或挂起了正常的类型检查。
为了是程序达到你想要的效果,我们常常使用 static_cast 取代由编译器实现的隐式转换。-----编辑器隐式转换,你必须很清楚的知道转换顺序,不然可能得不到你想要的结果。
对于上面两个程序,在实际任务中,需要怎么去计算,需要自己很好的把握,不能混淆了计算的顺序,导致错误。
不过,还是要建议尽量避免使用强制类型转化,因为强制类型转换关闭或挂起了正常的类型检查。强烈建议程序员避免使用强制类型转换,不依赖强制类型转换也能写出很好的 C++程序。每次使用强制转换前,程序员应该仔细考虑是否还有其他不同的方法可以达到同一目的。如果非强制转换不可,则应限制强制转换值的作用域,并且记录所有假定涉及的类型,这样能减少错误发生的机会。使用了强制类型转换,在出现问题时,可能难以定位问题到底出现在那一块。