«Если» заявление и двоеточие - PullRequest
12 голосов
/ 15 декабря 2008

Вот интересный фрагмент кода, о котором мои коллеги по команде только что обсуждали ...

  Dim fred As Integer

  If True Then fred = 5 : fred = 3 : fred = 6 Else fred = 4 : fred = 2 : fred = 1

После выполнения приведенного выше фрагмента кода, каково значение fred ?

Старайтесь не обманывать и не отлаживать код.

Это пример очень искусственного кода, который начинался как пример использования двоеточия с оператором If, но затем кто-то решил взять его на себя, чтобы предложить результат для fred .

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

Ответы [ 5 ]

16 голосов
/ 15 декабря 2008

Полагаю, вы имеете в виду VB.Net.

Согласно грамматике в спецификации языка VB, которую вы можете прочитать здесь:

http://www.microsoft.com/Downloads/thankyou.aspx?familyId=39de1dd0-f775-40bf-a191-09f5a95ef500&displayLang=en

Результат должен быть "6".

Это потому, что грамматика для "оператора if строки":

If  BooleanExpression  Then  Statements  [  Else  Statements  ]  StatementTerminator

и «операторы» определены как

Statements  ::=
[  Statement  ]  |
Statements  :  [  Statement  ]

Edit: Я хотел бы отметить, что отладка кода не является "обманом".

Раньше я работал в команде компилятора VB в Microsoft.

Были времена, когда спецификации были неоднозначными или не соответствовали тому, что мы на самом деле отправили. В некоторых из этих случаев решение (что мы сделали, чтобы исправить это) всегда основывалось на «хорошо ... что сейчас делает компилятор».

Иногда мы меняем компилятор, иногда мы меняем спецификацию.

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

Итак ... отладка кода - большая часть выяснения того, что он делает ...

3 голосов
/ 15 декабря 2008

Я давно не использовал BASIC так широко, так что это всего лишь предположение, но я думаю, что fred - это 6.

Честно говоря, код не очень читабелен. Я чувствую, что при отсутствии всего в одной строке и использовании отступа код будет более читабельным:

Dim fred As Integer

If True Then
    fred = 5
    fred = 3
    fred = 6
Else
    fred = 4
    fred = 2
    fred = 1
End If

Я считаю, что это эквивалентный код, если я не ошибаюсь.

Но, если код не эквивалентен, это поднимает другой вопрос: оригинальный код «хитрый» в том смысле, что то, что он говорит, не совсем то, что происходит на самом деле. Аналогично ловушке в языках стиля C:

if (condition)
    do_something();
    do_other_thing();

Код, похоже, подразумевает, что do_something и do_other_thing выполняются, когда condition истинно, но в действительности do_other_thing всегда выполняется.

Лучше всего придерживаться стилей кодирования, которые делают намерение кода более очевидным и менее двусмысленным.

2 голосов
/ 15 декабря 2008

Окончательный результат - 6.
Теперь реальный вопрос: как вы попали в мой репо?
: -)

0 голосов
/ 05 марта 2011

В действительно старых базовых диалектах единственной вещью, которая могла следовать за "ТОГДА", был номер строки. Многие диалекты улучшили это, позволив коду следовать «ТОГДА»; после анализа «THEN» они переходили к следующей строке, если указанное условие было ложным, или продолжали бы с текущей строки. Дальнейшие диалекты добавили возможность пропустить до конца строки или «ELSE», в зависимости от того, что наступит раньше; попытка выполнить инструкцию "ELSE" приведет к переходу в конец строки.

Когда был введен QuickBasic, он добавил поддержку многострочных блоков if / then / else, но сохранил поддержку подхода старого стиля. Visual Basic последовал их примеру, а vb.net продолжает традицию.

0 голосов
/ 15 декабря 2008

Просто предположение

fred = 6, поскольку в одной строке может быть несколько операторов, разделенных двоеточием.

Не уверен, что "else" допустимо (т.е. компилируется)

ИМХО лучше выбрать стиль кодирования:


if (condition) then
  statement
  statement
else
  statement
  statement
end if
...