何时需要强制类型转换?

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

#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++程序。每次使用强制转换前,程序员应该仔细考虑是否还有其他不同的方法可以达到同一目的。如果非强制转换不可,则应限制强制转换值的作用域,并且记录所有假定涉及的类型,这样能减少错误发生的机会。使用了强制类型转换,在出现问题时,可能难以定位问题到底出现在那一块。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值