在阅读 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/