我有点困惑,我设法不小心写了相当于这个的代码
int a=a; // there is not a declared before this line
并且编译器愉快地编译了它 - gcc和clang,它们都非常符合标准且具有良好的诊断功能。 (对于-Wall
,gcc 4.8警告未初始化的变量; clang不警告。
我认为在执行LHS之前将评估赋值的RHS,因此导致在RHS上未定义a
。我可以对这个语法合法的原因进行一些简单的澄清吗?
答案 0 :(得分:4)
如果你告诉GCC这样做,那将是一个编译时错误:
gcc -Winit-self -Werror
请注意,遗憾的是,大多数常见的嫌疑人都没有启用此诊断功能,例如-Wall。
答案 1 :(得分:2)
名称的范围在完成声明后立即开始。因此,a
在初始化时已经在范围内。
Stroustrup与您提到的用于演示范围规则的示例相同。
参见:Stroustrup“The C ++ Programming Language,4th ed。”,p.158。
编辑: 糟糕,没有注意到问题被标记为“C”,但仍然,我认为它也适用于C