Более или менее, это игра на висящей задаче .
Например,
if( blah )
if ( more blah )
// do some blah
else
// no blah I suppose
Без фигурных скобок остальное неоднозначно, потому что вы не знаете, связано ли это с первым или вторым оператором if. Таким образом, вы должны откатиться на соглашение компилятора (например, в Pascal или C, компилятор предполагает, что зависание еще связано с ближайшим оператором if), чтобы разрешить неоднозначность, или полностью потерпеть неудачу при компиляции, если вы не хотите разрешить такую неоднозначность во-первых.
Аналогично,
try
try
// some code that throws!
catch(some blah)
// which try block are we catching???
catch(more blah )
// not so sure...
finally
// totally unclear what try this is associated with.
Вы можете решить это с помощью соглашения, в котором блоки catch всегда связаны с ближайшей попыткой, но я считаю, что это решение обычно позволяет программистам писать код, который потенциально опасен. Например, в C это:
if( blah )
if( more blah )
x = blah;
else
x = blahblah;
... это то, как компилятор интерпретирует это, если / if / else блок. Тем не менее, это также вполне законно, чтобы испортить ваш отступ и написать:
if( blah )
if( more blah )
x = blah;
else
x = blahblah;
... который теперь заставляет его выглядеть так, как будто else связан с внешним оператором if, тогда как на самом деле он связан с внутренним оператором if из-за соглашений на языке Си. Так что я думаю, что наличие скобок - это долгий путь к устранению двусмысленности и предотвращению довольно хитрой ошибки (такого рода проблемы могут быть несущественными, даже во время проверки кода). Такие языки, как python, не имеют этой проблемы, так как отступы и пробелы имеют значение.