Два ifs и еще один в C #.Что просходит? - PullRequest
1 голос
/ 01 июля 2011

например:

if(cond1)
if(cond2) DoCond2();
else DoCond3();

Будет ли оператор else рассматриваться как остальная часть первого if или второго if?Зачем?(есть ли объяснение с синтаксической точки зрения?) Является ли ответ тем же в других языках программирования на основе C, таких как C и Java?

Примечание: это не домашняя работаЯ могу легко протестировать его и использовать фигурные скобки, если мне не нравится поведение по умолчанию, но мне любопытно узнать причину.очень серьезная ошибка в оригинальном примере.Проверьте еще раз, пожалуйста.Я знаю, это смущает.К сожалению.

Ответы [ 4 ]

4 голосов
/ 01 июля 2011

Согласно MSDN

В вложенных операторах if предложение else принадлежит последнему, если для него нет соответствующего else.

Также C и C ++, условия могут быть оценены, если результат 0 равен false, а любое другое число - true. В C # условие должно принимать логическое значение true / false

EDIT В соответствии с Edit это вложенный if, поэтому внутренний вычисляется, когда true, а все еще остальное с внутренним if

.
2 голосов
/ 01 июля 2011

Будет ли оператор 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.

1 голос
/ 01 июля 2011

Давайте разберемся, как работает оператор if.

После предложения if вы можете иметь две вещи:

  • Однострочный оператор
  • Многострочный оператор

Однострочный оператор подобен двум приведенным вами примерам.В этом сценарии else принадлежит if только в том случае, если он идет сразу после него (как ваш второй пример).

Многострочный оператор будет иметь фигурные скобки { } после оператора if.else после закрывающей скобки делает его принадлежащим этому оператору.

Вы можете "связать" if операторы, используя синтаксис else if.Следующее if будет вести себя как обычный if, но будет проверено, только если предыдущий if вернет false.В вашем примере оба оператора if будут проверены независимо от результата.

1 голос
/ 01 июля 2011

Может быть, чтобы понять это, было бы полезно добавить фигурные скобки:

if(cond1) {
    DoCond1();
}
if(cond2) {
    DoCond2();
} else {
    DoCond3();
}

Если после if или else нет скобок, только первый оператор (в данном случае DoCondX) принадлежит блоку if / else.

РЕДАКТИРОВАТЬ Глядя на код после редактирования:

if(cond1) {
    if(cond2) {
        DoCond2();
    } else {
        DoCond3();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...