它们的基本意思是,在 C 中,使用const限定变量来初始化另一个变量或在全局范围内确定数组的大小是非法的,例如:
const int SIZE = 5;
int a = SIZE; // This is not allowed.
int b[SIZE]; // This is also not allowed.
int main(void)
{
...
}
这是因为全局范围内的变量和数组需要在编译时确定。合格的const变量仍然是变量,并且变量的值在运行时计算/评估。
一个宏常量,它是一个“编译时间常量”,可以像 fe 这样使用:
#define SIZE 15
int a[SIZE]; // This is ok.
int b = SIZE; // This is ok, too.
我也不太了解const变量和常量表达式之间的区别。所有const变量都是常量表达式,对吧?
不。
引自 ISO:IEC 9899/2018 (C18),第 6.6/2 节:
"常量表达式可以在翻译期间而不是运行时求值,因此可以在常量可能存在的任何地方使用。 "
常量表达式是一个文字表达式,它总是被评估为相同的值 - 评估的值是常量。因此它可以在编译时进行评估。
铁:
5 + 4
始终为 9,因此可以在编译时进行评估。
而一个const变量:
const int SIZE = 5;
或者
(const int SIZE 5;)
5 + 9 + SIZE;
不是常量表达式,因为它暗示了一个变量。尽管该变量SIZE是由 限定的const(这意味着它在初始化后不能修改),但它不是一个常量表达式,因为一个变量,不管它是否const存在,都是在运行时计算/评估的。
const限定变量不是也不能是常量表达式的一部分。