这不是问题,但我想了解以下行为:
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时,声明必须位于函数的顶部,我不能使用常量变量,因为赋值必须放在声明之后。唯一的解决方案是声明非常量变量或初始化所有变量。我发现这个“脏”。答案 0 :(得分:5)
我不明白为什么即使是初始化也是禁止的。
密钥在错误消息中:
错误:分配只读变量'a'
它不是初始化,它是赋值。赋值修改现有对象,如果所述对象为const
,则不允许这样做。
另一方面,尽管使用=
语法, 是初始化:
int const a = 50;
答案 1 :(得分:4)
因为它是一个常数!
a = 50;
是一项任务,而不是初始化。
int const a;
实际上将a
设置为不确定的值(顺便说一下,你永远不应该读取它)。如果你很好地问它,你的编译器可能会警告你。
答案 2 :(得分:2)
"编译器是否没有检测到第4行是第一次做作?"
在这个简单的案例中,它可以。但是,编写规则以涵盖所有初始化情况。 编译器一次查看一个文件。程序可以由许多文件组成。该语言允许变量在一个翻译单元(文件)中声明,并在另一个翻译单元中使用。 这些规则是为了处理所有这些案件而编写的