Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Ambiguous if and else branches: Is the behaviour defined?

Tags:

c++

c

I recently came accross some C++ code like the following:

if(test_1)
    if(test_2)
    {
         // Do stuff
    }
    else
       exit(0);

This is ambiguous, since the compiler could see this as:

if(test_1)
{
    if(test_2)
    {
    }
    else
    {
    }
}

or as:

if(test_1)
{
    if(test_2)
    {
    }
}
else
{
}

Is the behaviour of this code defined according to any standard (C, C++)? I saw this code in a C++ program on VC++, which seems to prefered the first solution.

like image 446
wormsparty Avatar asked Oct 04 '11 08:10

wormsparty


3 Answers

Is the behaviour of this code defined according to any standard (C, C++)?

Yes, it is defined. In C (and all similar languages as I know), the "dangling else" binds to the last free if, therefore this interpretation

if(test_1)
{
    if(test_2)
    {
    }
    else
    {
    }
}

is correct.

like image 74
jpalecek Avatar answered Sep 30 '22 14:09

jpalecek


There is no ambiguity. The else clause always refers to the closest if it can be attached to. From the C++ standard (6.4 Selection statements):

In clause 6, the term substatement refers to the contained statement or statements that appear in the syntax notation. The substatement in a selection-statement (each substatement, in the else form of the if statement) implicitly defines a local scope (3.3).

If the substatement in a selection-statement is a single statement and not a compound-statement, it is as if it was rewritten to be a compound-statement containing the original substatement. [ Example:

   if (x) int i;

can be equivalently rewritten as

     if (x) { 
           int i;
     }

It ensues that the code you wrote can be rewritten as:

if(test_1)
{
    if(test_2)
    {
        // Do stuff
    }
    else
    {
        exit(0);
    }
}
like image 31
sergio Avatar answered Sep 30 '22 14:09

sergio


It is well defined. else is always paired with the nearest available if.

like image 36
Juraj Blaho Avatar answered Sep 30 '22 13:09

Juraj Blaho