<jupyter_start><jupyter_text>常量表达式```{admonition} 需求学习使用 `constexpr` 与 `const`。``````{hint}{guilabel}`视频`- [C++ const 与 constexpr](https://www.bilibili.com/video/BV1Db4y1Y7zF)```**符号常量**:    用于表示那些在初始化后值就不再改变的数值量。    也可以简称为 **常量**。符号常量就是我们认知中的常量。比如圆周率 $\pi$，在使用过程中，不希望它是可变的，可以使用 **符号常量** 来实现这一目的：<jupyter_code>constexpr double pi = 3.1415926; // 定义一个符号常量 pi
pi = 7; // 错误，试图改变常量的值<jupyter_output>[1minput_line_8:2:5: [0m[0;1;31merror: [0m[1mcannot assign to variable 'pi' with const-qualified type 'const double'[0m
 pi = 7; // 错误，试图改变常量的值
[0;1;32m ~~ ^
[0m[1minput_line_7:2:19: [0m[0;1;30mnote: [0mvariable 'pi' declared const here[0m
 constexpr double pi = 3.1415926; // 定义一个符号常量 pi
[0;1;32m ~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~
[0m<jupyter_text>仅仅是使用常量，而非改变它是可行的：<jupyter_code>double c = 2 * pi;
c<jupyter_output><empty_output><jupyter_text>```{important}常量对于维护程序的可读性具有重要作用。``````{tip}除了个别情况（例如 0 和 1），程序中应该尽量少用字面常量，而是尽可能使用符号常量。``` 常量表达式**常量表达式**:    仅由常量构成的 **整型值** 表达式。<jupyter_code>constexpr int max = 18; // 字面常量是常量表达式
int val = 19;

max + 7; // 常量表达式（即常量整数+字面常量）
val + 2; // 因为使用了变量，不是常量表达式<jupyter_output><empty_output><jupyter_text>一个 `constexpr` 符号常量必须给定一个在编译时已知的值。```c++constexpr int max = 500;void use(int n) {    constexpr int c1 = max + 7; // 正确，c1 是 507    constexpr int c2 = n + 7; // 错误，不知道 c2 的值是多少    // ...}```  只读**只读**:    若某个变量初始化时的值在编译时未知，但初始化后也绝对不改变。C++ 提供了只读变量的表示：`const`。上面的代码可以改写为：<jupyter_code>constexpr int max = 500;
void use(int n) {
    constexpr int c1 = max + 7; // 正确，c1 是 507
    const int c2 = n + 7; // 正确，但是 c2 的值可以改变
    // ...
}<jupyter_output><empty_output><jupyter_text>由于 `c2` 是一个只读的常量，所以：<jupyter_code>void use(int n) {
    constexpr int c1 = max + 7; // 正确，c1 是 507
    const int c2 = n + 7; // 正确，但是 c2 的值可以改变
    // ...
    c2 = 7; // 错误，c2 是常量
}<jupyter_output>[1minput_line_23:5:8: [0m[0;1;31merror: [0m[1mcannot assign to variable 'c2' with const-qualified type 'const int'[0m
    c2 = 7;
[0;1;32m    ~~ ^
[0m[1minput_line_23:3:15: [0m[0;1;30mnote: [0mvariable 'c2' declared const here[0m
    const int c2 = n + 7; // 正确，但是 c2 的值可以改变
[0;1;32m    ~~~~~~~~~~^~~~~~~~~~
[0m
{'fraction_non_alphanumeric': 0.20810055865921787, 'fraction_numerical': 0.06750465549348231, 'mean_word_length': 4.903846153846154, 'pattern_counts': {'":': 0, '<': 19, '<?xml version=': 0, '>': 19, 'https://': 1, 'lorem ipsum': 0, 'www.': 1, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '5', 'dir': 'jupyter-structured-clean-dedup', 'id': '11858', 'license': 'Apache-2.0', 'n_tokens_mistral': 1303, 'n_tokens_neox': 1265, 'n_words': 179, 'path': 'docs/start/constexpr.ipynb', 'repo_name': 'xinetzone/cpp-book', 'size': '2148'}