zoukankan      html  css  js  c++  java
  • 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


  • 相关阅读:
    JS事件类型详解
    migrate的使用
    phpMyAdmin安装教程
    Unable to verify your data submission错误解决
    安装yii2高级应用模板
    关于模型中的几个概念或知识点
    视图被渲染的几种方式
    统计学与大数据分析
    物联网、云计算、大数据、人工智能概念如何区分
    物联网、云计算、大数据、人工智能概念如何区分
  • 原文地址:https://www.cnblogs.com/xkfz007/p/2391878.html
Copyright © 2011-2022 走看看