c - 什么时候 const 被认为是真正的 const?

标签 c compiler-errors constants

在阅读 stackoverflow 中的一些问题和答案时,我遇到了这个 question

我试图理解它,但答案真的很难理解,尤其是像

这样的术语
  • 静态存储时长

  • 翻译阶段无法计算表达式

等...

除此之外,我认为常数永远是常数(这是我从学校学到的)

有人可以让它更容易理解吗?

最佳答案

在 C 中(与 C++ 不同),只有当表达式中的每个值都是数字常量或枚举值的名称时,算术表达式才是“常量表达式”。也就是说,尽管您可能已将变量声明为 static const int,但您仍然不能在常量算术表达式中使用该(常量)变量。

请注意,“常量表达式”是由定义 C 语言的正式标准定义的短语。还有一些直觉上不变的表达式,但它们不包含在正式定义中。

具有“静态存储持续时间”的变量只是在整个程序执行过程中存在的变量。大多数此类变量都是全局变量(即不是任何函数的一部分,甚至不是 main),但在 C 和 C++ 中,您可以在函数范围内拥有一个 static 变量.这样的变量只被初始化一次,并且无论函数被调用多少次,它都只存在一个实例。

全局变量和其他具有静态存储持续时间的变量,只能根据上述定义初始化为常量表达式。 无论是否它们都是 const 变量,情况都是如此。问题很简单,变量具有静态存储持续时间,这意味着它们必须在程序执行之前初始化。 (具有静态存储持续时间的变量存在于整个程序的执行过程中,因此如果它被初始化——也就是说,给定一个初始值,而不是在程序执行期间被赋值——初始化必须在程序执行之前发生。)

在 C++ 中,声明为 static const 的变量被视为常量值,因此它可以出现在常量表达式中。然而,在 C 中,情况并非如此,因此 C 编译器不需要跟踪 static const 变量的初始值。

关于c - 什么时候 const 被认为是真正的 const?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27574399/

相关文章:

c - 跳过 C 语言中以逗号分隔的单词的第一行

c - 程序在 Linux 和 Windows 上挂起,似乎在 Mac 上运行

c - C中的SysRandom是什么意思

rust - 如何在 Cargo 中创建 C 静态库?

compiler-errors - 链接包括NetCDF代码的f90

Jquery 恒定窗口高度

c - 在 C 中从低到高对数组进行排序(不使用 qsort)

compiler-errors - 在Raspberry Pi2上编译libavg

c++ - const vs non-const 变量,赋值后值不变

c++ - 实现 std::hash<T> 时修改内部结构