AFAIK, if an “if” block is not provided the curly braces then only 1 statement is considered inside it. e.g.
if(..)
statement_1;
statement_2;
Irrespective of tabs, only statement_1 is considered inside the if block.
Following code doesn’t get along with that:
int main ()
{
if(false) // outer - if
if(false) // nested - if
cout << "false false\n";
else if(true)
cout << "true\n";
}
Above code doesn’t print anything. It should have printed "true".
It appears as of the else if is automatically nested inside the outer if block. g++ -Wall issues warning, but that is not the question here. Once you put the curly braces, everything goes fine as expected.
Why such different behavior ?
[GCC demo: without braces and with braces].
The behaviour isn’t actually different, it’s entirely consistent: the whole inner
ifblock – includingelse if– is considered as one block.This is a classical ambiguity in parsing, known as the “dangling-
elseproblem”: there are two valid ways of parsing this when the grammar is written down in the normal BNF:Either the trailing
elseis part of the outer block, or of the inner block.Most languages resolve the ambiguity by (arbitrarily) deciding that blocks are matched greedily by the parser – i.e. the
else[if] is assigned to the closestif.