c/c++的隐式转换

#include <iostream>
using namespace std;
int main()
{
unsigned int i_size = 2;
char* pName = new char[i_size];
memset(pName, 0, i_size);
for(int i=0;i<i_size -4;i++)
{
pName[i] = 'a';
}
cout<<pName<<endl;
delete []pName;
pName = NULL;
}


思考一下,上面的程序, 你的预期结果是?

好了,答案是崩溃;

这是工作中遇到的代码,一个低级错误。

对于这一句代码

i<i_size -4;

预计结果为(0<-2)=false,跳出for循环;

实际结果为(0<4294967294)=true,程序一直循环,访问pName到pName+4294967294之间的内存,直到内存访问错误引起崩溃。

正确的代码是

for(int i=0;i<(int)(i_size -4);i++)

这里不讨论用户自定义类型的隐式转换(explicit关键字)。

对于C/C++原生支持类型,记住下面的话,(引用自《编写高质量代码:改善C++程序的150个建议》 李健 )

"
c语言规定的转换规则是由低级向高级转换。两个通用的转换原则是:

(1)为防止精度损失,类型总是被提升为较宽的类型。

(2)所有含有小于整型类型的算术表达式在计算之前其类型都会被转换成整型。

这两点在C++中依旧有效,这已无须多言。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值