C++与C语言容易忽视的几个差异
http://www.cnblogs.com/xkfz007/archive/2012/03/12/2391878.html
看完《C专家编程》之后,从中了解到了几个。简单总结一下。
(1)在C++中,用户代码不能调用main函数,但在C语言中却是允许的。(所以可以递归调用main函数)
比如:
#include <stdio.h>
int a=5;
int main()
{
if(a==0)
return 0;
else
{
printf("call main again:%d\n",a);
a--;
main();
}
return 0;
}
输出如下:
call main again:5
call main again:4
call main again:3
call main again:2
call main again:1
(2)完整的函数原型声明在C++中是必须的,但在C语言中却没有这么严格。因为C++有着比较严格的类型检查,而C却相对比较灵活。
(3)当void*指针赋值给另一个类型的指针时,C++规定必须进行强制类型转换,但在C中却不是必要的。
所以当将C代码转换为C++代码时,对于那些内存分配的操作,比如mallco或calloc,使用C++编译器编译时这些地方都会报错:类型不匹配。
(4)在C++中,字符常量的类型是char,而在C语言中他们的类型是int。
这一点我以前从来不知道。
比如:
#include <stdio.h>
int main()
{
printf("%d\n",sizeof 'a');
return 0;
}
我使用gcc编译器编译,运行的结果是4
而使用g++编译运行的结果是1.
在windows平台下的结果也是一样的。
这一点非常容易忽视,如果不注意的话可能会成为引起程序异常的重要原因。
(5)C语言中的类型提升一定要特别注意。
类型提升可能发生在表达式中,这是很常见的,也可能发生在参数传递中。
这可以解释为什么printf函数的%d可以适用于short,char或int类型,因为不论上面的哪个类型,函数在从堆栈中(或寄存器中)取参数时总是int型。
如果使用printf函数输出比int长的整型入long long的话,就会出问题,这个也就是在网上有人讨论的,如何使用printf来打印64位的整型数的问题,一般要使用格式限定符%ld。因为%d默认的是int型(一般32位),所以就出问题了。
#include <stdio.h>
int main(int argc, char** argv)
{
long long x = 7332201052963203716ll;//注意后面有两个 l
long long y = 0x65c136028f9dea86ll; //同上
printf("x=%#llx\n", x);
printf("x=%lld\n", x);
printf("y=%#llx\n",y);
printf("y=%lld\n", y);
}
参考:http://blog.chongtang.me/index.php/1828