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

Why are those definitions not legal in C?

我正在读一本关于 C 的书,但我不明白这个概念:

Another common misconception is thinking of a const qualified variable as a constant expression. In C, const means "read-only", not "compile time constant". So, global definitions like const int SIZE = 10; int global_arr[SIZE]; and const int SIZE = 10; int global_var = SIZE; are not legal in C.

我也不太明白const变量和常量表达式的区别。所有 const 变量都是常量表达式,对吗?我已经阅读了有关此主题的其他问题,但我仍然没有理解。谢谢

他们的基本意思是,在 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 限定的变量仍然是一个变量,变量的值是 computed/evaluated 在 运行-time

一个宏常量,它是一个"compile time constant",可以像f.e这样使用:

#define SIZE 15

int a[SIZE];             // This is ok.
int b = SIZE;            // This is ok, too.

I also don't understand very good the difference between const variable and constant expression. All const variables are constant expressions, right?

没有。

引自 ISO:IEC 9899/2018 (C18),第 6.6/2 节:

"A constant expression can be evaluated during translation rather than runtime, and accordingly may be used in any place that a constant may be."

常量表达式是一个文字表达式,它总是被评估为相同的值 - 评估的值是常量。因此它可以在编译时评估。

F.e.:

5 + 4 

始终为 9,因此可以在编译时求值。

const 变量:

const int SIZE = 5;

(const int SIZE 5;)

5 + 9 + SIZE; 

不是常量表达式,因为它暗示了一个变量。虽然变量SIZEconst限定了(意思是初始化后不能修改),但它不是常量表达式,因为一个变量,如果const 与否,在 运行 时是 computed/evaluated。

const 限定变量不是也不能是常量表达式的一部分。

假设你有

int a = 42;
const int *b = &a;

现在 *bconst只读。如果不将 const 移除,则不允许更改 *b(感谢 Eric Postpischil)

// *b = -1; // not allowed
a = -1;
printf("%d\n", *b); // print -1

要点是:const 合格对象的值 可能 改变。常数值 永远不会 改变。