C 为什么在常量变量声明后无法初始化它?

C 为什么在常量变量声明后无法初始化它?,c,C,这不是问题,但我想了解以下行为: int main() { // This does not work int const a; a = 50; // This work int const a = 50; } 为什么编译器抛出以下错误: main.c:4:7:错误:分配只读变量“a” 我不明白为什么连初始化都被禁止。第3行在汇编语言中没有翻译。编译器是否没有检测到第4行是第一个做作(翻译问题:我指的是“赋值”) 编辑:好的,让我们假设C语言就是这样。

这不是问题,但我想了解以下行为:

int main() {
    // This does not work
    int const a;
    a = 50;

    // This work
    int const a = 50;
}
为什么编译器抛出以下错误:

main.c:4:7:错误:分配只读变量“a”

我不明白为什么连初始化都被禁止。第3行在汇编语言中没有翻译。编译器是否没有检测到第4行是第一个做作(翻译问题:我指的是“赋值”)

编辑:好的,让我们假设C语言就是这样。但这可能是一个问题,因为当我使用C89时,声明必须在函数的顶部,而我不能使用常量变量,因为赋值必须放在声明之后。唯一的解决方案是声明非常量变量或初始化所有变量。我觉得这个“脏”

我不明白为什么连初始化都被禁止

密钥位于错误消息中:

错误:只读变量“a”的赋值

这不是初始化,而是分配。赋值修改现有对象,如果所述对象为
const
,则不允许这样做

另一方面,尽管使用了
=
语法,但这是一种初始化:

int const a = 50;

因为它是一个常数

a=50是一项分配,而不是初始化

int常量a
本质上是将
a
设置为一个不确定的值(顺便说一下,您不应该读取该值)。如果你问得好的话,也许你的编译器会警告你这一点

“编译器没有检测到第4行是第一个冒充吗?”

在这个简单的例子中,它可以。但是,编写这些规则是为了涵盖所有初始化情况。 编译器一次查看一个文件。一个程序可能由许多文件组成。该语言允许在一个翻译单元(文件)中声明变量,并在另一个翻译单元(文件)中使用。
规则是这样写的,所以他们会处理所有此类案件

@MattTaylor,真的吗?我认为它是未指定的。@CIsForCookies不是真的,因为它依赖的不仅仅是编译器。@AlterMann,因为它是指向
const int
的非常量指针。因此,您可以更改指针,但不能通过所述指针修改指针指向的对象。@P45Immediate:6.7.8 Initialization>Semantics 10:如果没有显式初始化具有自动存储持续时间的对象,则其值是不确定的。如果没有显式初始化具有静态存储持续时间的对象,则:如果该对象具有指针类型,则将其初始化为空指针;如果它有算术类型,则初始化为(正或无符号)零;“
int const a;
So@MattTaylor:
a
在这种特殊情况下不必为0。但是,如果您编写
静态int a;
a
将初始化为
0