Ambiguous if and else branches: Is the behaviour defined?

前端 未结 5 1908
既然无缘
既然无缘 2021-01-18 11:33

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

if(test_1)
    if(test_2)
    {
         // Do stuff
    }
    else
       exit(0);
相关标签:
5条回答
  • 2021-01-18 11:59

    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.

    0 讨论(0)
  • 2021-01-18 12:14

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

    0 讨论(0)
  • 2021-01-18 12:16

    It is Defined in C. An else always gets paired with nearest if; therefore you should use proper braces to avoid ambiguity.

    0 讨论(0)
  • 2021-01-18 12:19

    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);
        }
    }
    
    0 讨论(0)
  • 2021-01-18 12:21

    Yes its not ambiguous, as the rules state where it is applied, but my GCC C++ compiler still gives a warning stating it is :

    /brainModule/BrainModule.cpp: In function ‘void failExpiredPendingAndRunning()’: ../brainModule/BrainModule.cpp:158:16: warning: suggest explicit braces to avoid ambiguous ‘else’ [-Wparentheses] if (job->isExpired() == false)

    g++ (Raspbian 6.3.0-18+rpi1+deb9u1) 6.3.0 20170516

    0 讨论(0)
提交回复
热议问题