C++与C语言容易忽视的几个差异

C和C++之间的关系非常的密切,我们也都知道C++是从C扩充而来的,但是这并不表示C++对C完全兼容。C++并不是C的超集,C的有些特性在C++中并不适用。

看完《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位),所以就出问题了。

一般对于64位,linux下用%lld, %llx 之类,windows 下用%I64d。
#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


 

posted @ 2012-03-12 15:33  Mr.Rico  阅读(...)  评论(...编辑  收藏