twlkyao
twlkyao

Reputation: 14628

C++ global and local variables

I have encountered the following code:

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

It can pass the compile, but gives the wrong answer, how to explain this?

Upvotes: 1

Views: 1983

Answers (8)

corazza
corazza

Reputation: 32374

The concept most answers are describing is called shadowing.

Upvotes: 0

humam
humam

Reputation: 191

In C++, it is possible to access the global variable if you have a local variable with the same name but you have to use the scope resolution operator ::

change the line:

int i = i;

to

int i = ::i;

and the program will compile and work

Upvotes: 0

Shravan40
Shravan40

Reputation: 9908

When you have two variable with same name, one is global and other is local. Then in this case local variable will get in use only in that particular scope. And global variable is unused.

Now, coming to your problem

#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; compiles without any error but when you run the program it will produce error because local i has indeterminate value.

Upvotes: 0

HelloWorld123456789
HelloWorld123456789

Reputation: 5369

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

is correct.

So in your program, the global i is ignored when the local i is encountered and it is initialized to itself. You'll get a garbage value as a result.

Upvotes: 0

Michael Burr
Michael Burr

Reputation: 340466

The int i = i; statement in main() declares a local variable that hides the global variable.

It initializes itself with itself (which has an indeterminate value). So the global i simply isn't used.

Upvotes: 6

nfusion
nfusion

Reputation: 599

Variables in the innermost scope will override variables with the same Name without warning.

Upvotes: 1

user3476093
user3476093

Reputation: 714

Variables in deeper scopes will override the variables with the same name in a higher scope. To access a global variable, precede the name with ::

Upvotes: 1

Irtaza
Irtaza

Reputation: 599

the Local variable is accessible, analogous to calling two people with a same name, one inside the room, and one outside the room. The one who is in the scope you are trying to access it , hears it.

Upvotes: 2

Related Questions