Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why is initialization of a new variable by itself valid? [duplicate]

Consider some code:

#include <iostream>

int main()
{
    using std::cout;
    int a=3;
    cout << "a="<<a<<"\n";

    {
        int a=a;
        cout << "new a = " << a << "\n";
        a=5;
        cout << "a = " << a << "\n";
    }
    cout << "old a = " << a << "\n";
}

I'd expect it to print

a=3
new a = 3
changed a = 5
old a = 3

But what I get actually appears to say new a = 0 in the second line. I thought that it would work like initialization list in a class' constructor, where one can write like

C::C(int a) : a(a) {}

But for some reason this is different. First, removing the outer code completely doesn't result in a compilation error. So I assume that int a=a; is valid. Turning on all the compiler warnings leads to this:

test.cpp: In function ‘int main()’:
test.cpp:10:15: warning: ‘a’ is used uninitialized in this function
         int a=a;

So my question now: why is this syntax valid at all? Why doesn't the compiler say something like "undefined variable a"?

like image 761
Ruslan Avatar asked Jan 26 '15 14:01

Ruslan


People also ask

What happens when you initialize a variable?

Initializing a variable means specifying an initial value to assign to it (i.e., before it is used at all). Notice that a variable that is not initialized does not have a defined value, hence it cannot be used until it is assigned such a value.

Why is it important to always initialize variables when you declare them?

In addition, when variables are initialized upon declaration, more efficient code is obtained than if values are assigned when the variable is used. A variable must always be initialized before use. Normally, the compiler gives a warning if a variable is undefined. It is then sufficient to take care of such cases.

What will happen when a variable initialization followed by a variable assignment in a program?

Initialization gives a variable an initial value at the point when it is created. Assignment gives a variable a value at some point after the variable is created.

Why is it best practice to initialize your variables?

The case for always initializing variables is more complex than it might seem at first. Essentially it avoids warning noise from the compiler about possible use of an uninitialized variable, which is a warning that you do want to have for the situation where initialization was intended but forgotten.


1 Answers

It's syntactically valid, since the variable's point of declaration comes before its initialiser, and the name is available anywhere after that point. This allows less dodgy initialisations like

void *p = &p;

which legitimately uses the name (but not the value) of the variable being initialised.

It's behaviourally invalid, since using the value of an uninitialised object gives undefined behaviour. That's not an error that requires diagnosis (since, in general, it can be difficult or impossible to analyse the program flow to see whether an object has been initialised), but as you note, many compilers will give a warning for straightforward cases like this.

like image 180
Mike Seymour Avatar answered Sep 18 '22 06:09

Mike Seymour