Будет ли оператор else рассматриваться как остальная часть первого if или второго if?
Редактировать (удалено то, что я сказал здесь оригинально - это не относится):
С такой конструкцией я не могу вам сказать. Синтаксис для каждого языка неоднозначен.
Но я лично предполагаю, что это "прилипнет" к ближайшему if
. В противном случае было бы почти невозможно читать.
Я бы сказал, попробуйте и посмотрите, но лучшее решение - применить стандарт кодирования, который запрещает людям когда-либо делать это ...
Почему? (есть ли объяснение с синтаксической точки зрения?)
Вы можете проверить (часто неофициальное) определение грамматики для каждого языка, чтобы понять, почему такие утверждения соединяются вместе, как они.
(Старая) официальная грамматика C #:
http://msdn.microsoft.com/en-us/library/aa645596(v=VS.71).aspx
Редактировать: Но это не сильно вам поможет, потому что грамматика для языков, подобных С, в этом случае требует контекста или преднамеренного обхода.
См .: http://en.wikipedia.org/wiki/Dangling_else#Context_Free_Solutions
Является ли ответ тем же в других языках программирования на основе C, таких как C и Java?
Грамматика - сложная вещь, и правильно определить вложенные области видимости довольно сложно. Но в целом, ответ часто будет вращаться вокруг определений block
с statement
с.
Вы можете определить statement
как строку, оканчивающуюся на ;
. Затем определите block
как серию statement
s, окруженную {
}
.
Таким образом, вы можете определить свой if
оператор как if block-or-statement [else block-or-statement]
, [
]
, обозначающий, что он необязательный.
Редактировать: Проблема с этим определением состоит в том, что такая грамматика требует контекста и решает проблему только с оригинальной формулировкой вашего вопроса. Когда это действительно неоднозначно (как ваша новая, отредактированная версия), вы должны иметь более высокий уровень обработки (контекст), чтобы справиться с неоднозначностью.
C ++, например:
Несколько раз в этом последнем документе вы увидите " dangling else ". Это конкретно описывает то, что вы ищете.
Эта проблема существует во многих языках, а не только в C-лайках. Это одна из причин, по которой вы видите явные выражения, такие как end if
в BASIC вариантах или Python правила для if
s.