常量表达式#
需求
学习使用 constexpr
与 const
。
- 符号常量
用于表示那些在初始化后值就不再改变的数值量。
也可以简称为 常量。
符号常量就是我们认知中的常量。比如圆周率 \(\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
。