用自己初始化变量:为什么它不是编译时错误?

时间:2014-01-16 11:13:41

标签: c syntax

我有点困惑,我设法不小心写了相当于这个的代码

int a=a; // there is not a declared before this line

并且编译器愉快地编译了它 - gcc和clang,它们都非常符合标准且具有良好的诊断功能。 (对于-Wall,gcc 4.8警告未初始化的变量; clang不警告。

我认为在执行LHS之前将评估赋值的RHS,因此导致在RHS上未定义a。我可以对这个语法合法的原因进行一些简单的澄清吗?

2 个答案:

答案 0 :(得分:4)

如果你告诉GCC这样做,那将是一个编译时错误:

gcc -Winit-self -Werror

请注意,遗憾的是,大多数常见的嫌疑人都没有启用此诊断功能,例如-Wall。

答案 1 :(得分:2)

名称的范围在完成声明后立即开始。因此,a在初始化时已经在范围内。

Stroustrup与您提到的用于演示范围规则的示例相同。

参见:Stroustrup“The C ++ Programming Language,4th ed。”,p.158。

编辑: 糟糕,没有注意到问题被标记为“C”,但仍然,我认为它也适用于C