2014-02-21 6 views
4

Этот пример кода работает правильно, например. входит первым, если, выпадает после того, как не встречается 2-й, если.Выполнение инструкции else после ввода инструкции if из-за завитушек

if (i < _commandList.Count) 
{ 
    if (output.Length > 0) 
     Console.WriteLine(output); 
} 
else 
    Console.WriteLine("Invalid Command."); 

Я изначально кодировал его как это, что не работает. Он входит в первую, если, не соответствует второму, если, как ожидалось, но затем вводит оператор else и выполняет запись.

if (i < _commandList.Count) 
    if (output.Length > 0) 
     Console.WriteLine(output); 
else 
    Console.WriteLine("Invalid Command."); 

Почему второй кодовый блок не работает так же, как первый блок? Поскольку только одна строка кода ниже первого утверждения, я считал допустимым, чтобы не было {}.

Для справки, стека кадра:

_commandList.Count = 1 
output.Length = 0 
i = 0 
+3

Используйте фигурные скобки - проблема решена. :) – user1477388

+0

'Отступ' не означает' Командный заказ'. –

ответ

22

Это «оборванных else» проблема: else всегда принадлежит ближайшему если, независимо от отступа.

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

+0

Мой совет: пусть ваша IDE создает фигурные скобки и автоматически отступывает ваш код. Эта ошибка больше не повторится. –

2

Указывая фигурные скобки, вы сообщаете компилятору, что else идет с первым, если вместо второго if.

12

Ответы dasblinkenlight верны. Я бы добавил, что это пример более общего принципа, иногда называемого принципом максимального таза . То есть: когда сталкивается с двусмысленностью, анализатор пытается сделать самую длинную возможную вещь , она может прямо сейчас.

if утверждение имеет две возможные формы:

if (Логическое-выражения)следствие-оператор

и

if (Логическое выражение)следствие-операторelseальтернативного заявление

Так что, когда у вас есть

if (c) if (d) E(); else F(); 

анализатор смотрит на него, как это:

  • Я собираюсь попытаться сделать большое заявление, которое я могу.
  • А, есть if. Я постараюсь сделать самый большой if, который я могу.
  • ОК, есть условие в круглых скобках.
  • И вот идет утверждение о последствиях. Опять же, я постараюсь сделать самое большое заявление, которое могу сделать.
  • Есть if. Опять же, давайте попробуем сделать максимально возможный оператор if.
  • В скобках есть условие
  • Существует заявление о последствиях. Есть else? Да! Мы можем сделать это if больше.
  • Существует альтернативный вариант else, и ... мы закончили внутренний if. Резюме разбора внешнего if.
  • Есть else? Нет. Мы не можем сделать внешний if больше.

Мораль этой истории: Получите привычку использовать фигурные скобки.

Смежные вопросы