zoukankan      html  css  js  c++  java
  • 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 取消某个符号的定义,再重新定义。

  • 相关阅读:
    HDU5620 KK's Steel(C++语言版)
    HDU5620 KK's Steel(C语言版)
    大整数分解算法
    大整数分解算法
    HDU1319 POJ1595 UVA406 UVALive5490 ZOJ1312 Prime Cuts【素数筛选+打表】
    HDU1106 排序
    B00004 atoi函数
    B00004 atoi函数
    HDU1262 寻找素数对
    HDU1262 寻找素数对
  • 原文地址:https://www.cnblogs.com/gkh-whu/p/11457818.html
Copyright © 2011-2022 走看看