在您的第一个代码中,两个声明都应该编译。海合会就在那里。Visual C++ 编译器有错误。
在第二个代码中,内部声明不应该编译。GCC 也是正确的,而 VC++ 是错误的。
GCC 在这两种情况下都是正确的。
从语法的角度来看,类似int a=a+100;
and的代码int a(a+100);
很好。它们可能会调用未定义的行为,具体取决于它们是在静态存储持续时间还是自动存储持续时间中创建的。
int a = a + 100; //well-defined. a is initialized to 100
//a on RHS is statically initialized to 0
//then a on LHS is dynamically initialized to (0+100).
void f()
{
int b = b + 100; //undefined-behavior. b on RHS is uninitialized
int a = a + 50; //which `a` is on the RHS? previously declared one?
//No. `a` on RHS refers to the newly declared one.
//the part `int a` declares a variable, which hides
//any symbol with same name declared in outer scope,
//then `=a+50` is the initializer part.
//since a on RHS is uninitialized, it invokes UB
}
请阅读与上述每个声明相关的评论。
请注意,具有静态存储持续时间的变量在编译时静态初始化为零,如果它们具有初始化程序,那么它们也在运行时动态初始化。但是具有自动存储持续时间的 POD 类型的变量不是静态初始化的。
有关静态初始化与动态初始化的更多详细说明,请参见: