考虑下面的代码:
#include <iostream>
int main()
{
using std::cout;
int a=3;
cout << "a="<<a<<"\n";
{
int a=a;
cout << "new a = " << a << "\n";
a=5;
cout << "a = " << a << "\n";
}
cout << "old a = " << a << "\n";
}
我期望它能打印。
a=3
new a = 3
changed a = 5
old a = 3
但是我实际上得到的似乎是第二行写成了new a = 0
。 我认为它应该像类构造函数中的初始化列表一样工作,其中可以编写如下内容:
C::C(int a) : a(a) {}
但由于某些原因,这里有所不同。首先,完全删除外部代码并不会导致编译错误。因此我认为int a=a;
是有效的。打开所有编译器警告将得到以下提示:
test.cpp: In function ‘int main()’:
test.cpp:10:15: warning: ‘a’ is used uninitialized in this function
int a=a;
那么我的问题是:为什么这种语法是有效的呢?为什么编译器不会说类似于“未定义变量a”的话呢?
int x = x;
是UB吗?和C++14标准在使用不确定值和未定义行为方面是否发生了变化? - Shafik Yaghmour