#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++中依旧有效,这已无须多言。
“