常量表达式

常量表达式#

需求

学习使用 constexprconst

提示

视频

符号常量

用于表示那些在初始化后值就不再改变的数值量。

也可以简称为 常量

符号常量就是我们认知中的常量。比如圆周率 \(\pi\),在使用过程中,不希望它是可变的,可以使用 符号常量 来实现这一目的:

constexpr double pi = 3.1415926; // 定义一个符号常量 pi
pi = 7; // 错误,试图改变常量的值
input_line_8:2:5: error: cannot assign to variable 'pi' with const-qualified type 'const double'
 pi = 7; // 错误,试图改变常量的值
 ~~ ^
input_line_7:2:19: note: variable 'pi' declared const here
 constexpr double pi = 3.1415926; // 定义一个符号常量 pi
 ~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~

Interpreter Error: 

仅仅是使用常量,而非改变它是可行的:

double c = 2 * pi;
c
6.2831852

重要

常量对于维护程序的可读性具有重要作用。

小技巧

除了个别情况(例如 0 和 1),程序中应该尽量少用字面常量,而是尽可能使用符号常量。

常量表达式#

常量表达式

仅由常量构成的 整型值 表达式。

constexpr int max = 18; // 字面常量是常量表达式
int val = 19;

max + 7; // 常量表达式(即常量整数+字面常量)
val + 2; // 因为使用了变量,不是常量表达式
21

一个 constexpr 符号常量必须给定一个在编译时已知的值。

constexpr int max = 500;

void use(int n) {
    constexpr int c1 = max + 7; // 正确,c1 是 507
    constexpr int c2 = n + 7; // 错误,不知道 c2 的值是多少
    // ...
}

只读#

只读

若某个变量初始化时的值在编译时未知,但初始化后也绝对不改变。

C++ 提供了只读变量的表示:const

上面的代码可以改写为:

constexpr int max = 500;
void use(int n) {
    constexpr int c1 = max + 7; // 正确,c1 是 507
    const int c2 = n + 7; // 正确,但是 c2 的值可以改变
    // ...
}

由于 c2 是一个只读的常量,所以:

void use(int n) {
    constexpr int c1 = max + 7; // 正确,c1 是 507
    const int c2 = n + 7; // 正确,但是 c2 的值可以改变
    // ...
    c2 = 7; // 错误,c2 是常量
}
input_line_23:5:8: error: cannot assign to variable 'c2' with const-qualified type 'const int'
    c2 = 7;
    ~~ ^
input_line_23:3:15: note: variable 'c2' declared const here
    const int c2 = n + 7; // 正确,但是 c2 的值可以改变
    ~~~~~~~~~~^~~~~~~~~~

Interpreter Error: 

提示

C++98 不支持 constexpr,只能使用 const