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