在不同的空格中使用具有相同名称的变量

时间:2015-10-01 20:16:51

标签: c++ c variable-declaration

此代码编译,但我在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;
}

4 个答案:

答案 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;
}