我正在评论C++中的细微点。我发现了一个有趣的问题。你能否检查一下并分享你的推理,为什么它的工作原理如此。为什么局部变量不能隐藏数组定义中的全局变量
谢谢
const int x = 5;
void func() {
// ! Error
// int x = x;
// ! Fine
int x[x];
x[0] = 12;
cout << x[0];
}
我正在评论C++中的细微点。我发现了一个有趣的问题。你能否检查一下并分享你的推理,为什么它的工作原理如此。为什么局部变量不能隐藏数组定义中的全局变量
谢谢
const int x = 5;
void func() {
// ! Error
// int x = x;
// ! Fine
int x[x];
x[0] = 12;
cout << x[0];
}
声明中变点(即,在该名假定该声明所赋予的涵义,隐藏任何其他实体与一个同名点更广泛的范围)在申报者之后,并且在任何初始者之前。所以这个:
int x = x;
^point of declaration
初始化局部变量x
有自己未初始化值,给未定义行为(尽管它仍然是良好的,所以,除非你要求它编译器应该不会拒绝吧)。
虽然此:
int x[x];
^point of declaration
使用说明符,这是良好形成并且良好定义内的全局常量x
。这对于读者来说可能会让人困惑,但编译器没有问题。
这一规则的理由是,这是合理的在自己的初始化器使用一个变量的地址(而不是值),一个简单的例子是
void * p = &p;
为什么void * p =&p正在工作?是不是像int x = x; – 2015-02-24 12:30:37
@MuratKarakuş:它使用变量的地址(在初始化之前定义好),而不是值(未定义)。 – 2015-02-24 12:31:25
谢谢@Mike,我现在明白了 – 2015-02-24 12:33:21
是什么让你确认它不是躲在'常量int x = 5;'? – 2015-02-23 17:16:43
@πάνταῥεῖ我不明白你的问题,但我想你是问为什么数组定义工作正确?如果是这样,我已经编译并检查了它。 – 2015-02-23 17:19:15