C ++全局变量和局部变量

时间:2014-03-30 09:32:29

标签: c++ variables scope

我遇到了以下代码:

#include<iostream>
using namespace std;
int i = 1;
int main(int argc,char ** argv)
{
    int i = i;
    cout<<i<<endl; // which i?
    return 0;
}

它可以通过编译,但给出了错误的答案,如何解释这个?

8 个答案:

答案 0 :(得分:6)

int i = i;中的main()语句声明了一个隐藏全局变量的局部变量。

它自己初始化(具有不确定的值)。因此,全球i根本就没有使用过。

答案 1 :(得分:2)

可以访问Local变量,  类似于呼叫两个同名的人,一个在房间内,一个在房间外面。 在你试图访问它的范围内的人,听到它。

答案 2 :(得分:1)

最里面范围内的变量将覆盖具有相同名称且没有警告的变量。

答案 3 :(得分:1)

更深范围内的变量将覆盖更高范围内具有相同名称的变量。要访问全局变量,请在名称前加::

答案 4 :(得分:0)

int main()
{
    int i=i;
    return 0;
}

是对的。

因此,在您的程序中,当遇到本地i并将其初始化为自身时,将忽略全局i。结果会得到垃圾值。

答案 5 :(得分:0)

当你有两个同名的变量时,一个是全局的,另一个是本地的。然后在这种情况下,局部变量将仅在该特定范围内使用。并且全局变量未使用。

现在,来解决你的问题

#include<iostream>
using namespace std;
int i = 1;//Global Variable decleration
int main(int argc,char ** argv)
{
    int i = i; // Local to main
    cout<<i<<endl; // which i?
    return 0;
}

int i = i;编译时没有任何错误,但是当您运行程序时,它会产生错误,因为本地i具有不确定的值。

答案 6 :(得分:0)

在C ++中,如果您有一个具有相同名称的局部变量但是您必须使用范围解析运算符::

,则可以访问全局变量。

更改行:

int i = i;

int i = ::i;

程序将编译并运行

答案 7 :(得分:0)

大多数答案所描述的概念称为shadowing