• C++常量的定义以及宏定义 #define 和常量 const 的区别


    定义常量

    在 C++ 中,有两种简单的定义常量的方式:

    • 使用 #define 预处理器。
    • 使用 const 关键字。

    #define 预处理器

    下面是使用 #define 预处理器定义常量的形式:

    #define identifier value

    具体请看下面的实例:

    实例

    #include <iostream>
    using namespace std;
    #define LENGTH 10
    #define WIDTH 5
    #define NEWLINE 'n'
    int main()
    {
    int area;
    area = LENGTH * WIDTH;
    cout << area;
    cout << NEWLINE;
    return 0;
    }

    当上面的代码被编译和执行时,它会产生下列结果:

    50

    const 关键字

    您可以使用 const 前缀声明指定类型的常量,如下所示:

    const type variable = value;

    具体请看下面的实例:

    实例

    #include <iostream>
    using namespace std;
    int main()
    {
    const int LENGTH = 10;
    const int WIDTH = 5;
    const char NEWLINE = 'n';
    int area;
    area = LENGTH * WIDTH;
    cout << area;
    cout << NEWLINE;
    return 0;
    }

    当上面的代码被编译和执行时,它会产生下列结果:

    50

    请注意,把常量定义为大写字母形式,是一个很好的编程实践。

    宏定义 #define 和常量 const 的区别

    类型和安全检查不同

    宏定义是字符替换,没有数据类型的区别,同时这种替换没有类型安全检查,可能产生边际效应等错误;

    const常量是常量的声明,有类型区别,需要在编译阶段进行类型检查

    编译器处理不同

    宏定义是一个"编译时"概念,在预处理阶段展开,不能对宏定义进行调试,生命周期结束与编译时期;

    const常量是一个"运行时"概念,在程序运行使用,类似于一个只读行数据

    存储方式不同

    宏定义是直接替换,不会分配内存,存储与程序的代码段中;

    const常量需要进行内存分配,存储与程序的数据段中

    定义域不同

    void f1 ()
    {
        #define N 12
        const int n 12;
    }
    void f2 ()
    {
        cout<<N <<endl; //正确,N已经定义过,不受定义域限制
        cout<<n <<endl; //错误,n定义域只在f1函数中
    }

    定义后能否取消

    宏定义可以通过#undef来使之前的宏定义失效

    const常量定义后将在定义域内永久有效

    void f1()
    {
      #define N 12
      const int n = 12;
    
      #undef N //取消宏定义后,即使在f1函数中,N也无效了
      #define N 21//取消后可以重新定义
    }

    注意:

    const限定符定以后是不可以改变的,所以在定义时必须赋初始值,要不然是错误的,除非这个变量是用extern修饰的外部变量。

    const修饰一个变量,一定要给这个变量初始化值,若不初始化,后面就无法初始化. 例如:

    const int A=10;       //正确。
    const int A;          //错误,没有赋初始值。
    extern const int A;   //正确,使用extern的外部变量。

    预处理 #define 变量定义值以后,不能用分号,否则就会计算错误,但是程序不会报错。

    #define age  12
    #define age1 10
    
    #define age2  12;
    #define age3 10;

    是否可以做函数参数

    宏定义不能作为参数传递给函数

    const常量可以在函数的参数列表中出现

    角度1: 就定义常量说的话, const 定义的常数是变量 也带类型, #define 定义的只是个常数 不带类型。

    角度2: 就起作用的阶段而言,#define 是在编译的预处理阶段起作用,而 const 是在 编译、运行的时候起作用。

    角度3: 就起作用的方式而言,#define 只是简单的字符串替换,没有类型检查。而 const 有对应的数据类型,是要进行判断的,可以避免一些低级的错误。 正因为 define 只是简单的字符串替换会导致边界效应,具体举例可以参考下面代码:

    #define N 2+3     // 我们预想的 N 值是 5,我们这样使用 
    Ndouble a = N/2;  // 我们预想的  a 的值是 2.5,可实际上 a 的值是 3.5

    角度4: 就空间占用而言, 例如:

    #define PI 3.14     //预处理后 占用代码段空间
    const float PI=3.14;    // 本质上还是一个 float,占用数据段空间

    角度5: 从代码调试的方便程度而言, const 常量可以进行调试的,#define 是不能进行调试的,因为在预编译阶段就已经替换掉了

    角度6: 从是否可以再定义的角度而言, const 不足的地方,是与生俱来的,const 不能重定义,而 #define 可以通过 #undef 取消某个符号的定义,再重新定义。

  • 相关阅读:
    poj3304 Segments
    Java基础知识强化之IO流笔记27:FileInputStream读取数据一次一个字节数组byte[ ]
    Java基础知识强化之IO流笔记26:FileInputStream / FileOutputStream 复制mp4视频的案例
    Java基础知识强化之IO流笔记25:FileInputStream / FileOutputStream 复制图片案例
    Java基础知识强化之IO流笔记24:FileInputStream / FileOutputStream 复制文本文件案例2
    Java基础知识强化之IO流笔记23:计算机是如何识别把两个字节拼接为中文(附加)
    Java基础知识强化之IO流笔记22:FileInputStream / FileOutputStream 复制文本文件案例1
    Java基础知识强化之网络编程笔记08:TCP之客户端键盘录入服务器控制台输出
    Java基础知识强化之网络编程笔记07:TCP之服务器给客户端一个反馈案例
    Java基础知识强化之网络编程笔记06:TCP之TCP协议发送数据 和 接收数据
  • 原文地址:https://www.cnblogs.com/gkh-whu/p/11457818.html
Copyright © 2020-2023  润新知