• 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


  • 相关阅读:
    TabControl 切换 内嵌web页面直接响应滚动事件
    进程、应用程序域和对象上下文
    CSharp中的多线程——线程同步基础
    CSharp中的多线程——入门
    注重实效的程序员之快速参考指南
    学习语言技术快速入门——五步骤
    利用jQuery选择将被操作的元素
    CSharp中的多线程——使用多线程
    android开发文件介绍
    三角函数公式
  • 原文地址:https://www.cnblogs.com/xkfz007/p/2391878.html
Copyright © 2020-2023  润新知