c - 为什么这些定义在 C 中不合法?

c - 为什么这些定义在 C 中不合法?

它们的基本意思是,在 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限定变量不是也不能是常量表达式的一部分。

相关画作

快递单据销毁注意事项是什么(快递单的个人信息如何销毁)
适用于 Windows 的 12 款最佳音乐录制软件
365足球

适用于 Windows 的 12 款最佳音乐录制软件

📅 07-23 👁️ 8053
2025年效率之选:6款顶级做资料的软件工具全面对比
如何下载365app软件

2025年效率之选:6款顶级做资料的软件工具全面对比

📅 09-02 👁️ 3712