此代码编译,但我在Visual Studio中有运行时错误:
运行时检查失败#3 - 变量' x'正在使用而未被初始化......
int x = 15;
int main()
{
int x = x;
return 0;
}
我不理解这种行为......当我点击继续时,错误框中的程序会恢复,而x的内容已损坏(例如-8556328
而不是15
)。
为什么这段代码没有问题,并且int数组声明得很好?
const int x = 5;
int main()
{
int x[x] = {1,2,3,4};
return 0;
}
答案 0 :(得分:51)
x
定义在=
的左侧。
所以在x[x]
中,[x]
指的是全局的
而在x = x;
中,x
隐藏全局x
并从其自身初始化 - > UB。
答案 1 :(得分:35)
声明新变量时,其名称在此处可见
int x =
// ^- there
因为此时变量已完全声明,因此;它的名字意味着什么。此时,周围范围内的任何其他(先前声明的变量)将被隐藏。
答案 2 :(得分:5)
C中没有范围解析运算符,因此您可能无法使用
int x = x;
在您的计划中。
答案 3 :(得分:1)
请使用SRO(范围解析运算符:)来告诉编译器哪个x是真正的x。由于用户定义的名称被修改(名称被装饰),以避免在它的级别上出现歧义,这些只是编译器使用的最适合它的名称
int x = 15;// Real name = gui_x
int main()
{
int x = x;// lui_x
return 0;
}
通过这种方式,运行时将知道您正在使用哪个版本,但是为了避免使用特定名称而产生的歧义。有时上述问题出现在您不知道您正在使用已使用过的名称的地方。为此,C ++创建了SRO。
现在,如果数组x是地址&不是存储内容的整数,这就是编译器没有混淆的原因。你需要写
namespace abc //now all global variables are belongs to this ns abc
int x = 15;// Real name = gui_x
int main()
{
int x = abc::x;// lui_x
return 0;
}