为什么在声明后初始化常量变量是不可能的?

时间:2015-10-15 15:41:28

标签: 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时,声明必须位于函数的顶部,我不能使用常量变量,因为赋值必须放在声明之后。唯一的解决方案是声明非常量变量或初始化所有变量。我发现这个“脏”。

3 个答案:

答案 0 :(得分:5)

  

我不明白为什么即使是初始化也是禁止的。

密钥在错误消息中:

  

错误:分配只读变量'a'

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

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

int const a = 50;

答案 1 :(得分:4)

因为它是一个常数!

a = 50;是一项任务,而不是初始化。

int const a;实际上将a设置为不确定的值(顺便说一下,你永远不应该读取它)。如果你很好地问它,你的编译器可能会警告你。

答案 2 :(得分:2)

  
    

"编译器是否没有检测到第4行是第一次做作?"

  

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