何时需要强制类型转换?

来源:互联网 发布:淘宝网绣花鞋布鞋 编辑:程序博客网 时间:2024/06/09 15:47

可能运行程序时,大家或多或少出现过编译器报这样的警告:

#include<iostream>using namespace std;int main(){int i=3;double j=3.99;i*=j;cout<<i<<endl;//11system("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;//9system("pause");return 0;}

这次执行,编译器不会报任何错误,因为用到了强制类型转换,强制类型转换关闭或挂起了正常的类型检查。

为了是程序达到你想要的效果,我们常常使用 static_cast 取代由编译器实现的隐式转换。-----编辑器隐式转换,你必须很清楚的知道转换顺序,不然可能得不到你想要的结果。

对于上面两个程序,在实际任务中,需要怎么去计算,需要自己很好的把握,不能混淆了计算的顺序,导致错误。

不过,还是要建议尽量避免使用强制类型转化,因为强制类型转换关闭或挂起了正常的类型检查。强烈建议程序员避免使用强制类型转换,不依赖强制类型转换也能写出很好的 C++程序。每次使用强制转换前,程序员应该仔细考虑是否还有其他不同的方法可以达到同一目的。如果非强制转换不可,则应限制强制转换值的作用域,并且记录所有假定涉及的类型,这样能减少错误发生的机会。使用了强制类型转换,在出现问题时,可能难以定位问题到底出现在那一块。

0 0
原创粉丝点击