Оператор " If " и двоеточие

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

  Dim fred As Integer

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

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

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

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

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

5 ответов


Я предполагаю, что вы имеете в виду VB.Net.

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

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

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

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

If  BooleanExpression  Then  Statements  [  Else  Statements  ]  StatementTerminator

и "операторы" определяются как будь

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

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

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

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

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

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

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


Я не использовал 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 всегда выполняется.

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


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


только предположение

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

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

IMHO следует выбрать лучший стиль кодирования:


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

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

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