Подтвердить что ты не робот

Операция "Если" и толстая кишка

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

  Dim fred As Integer

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

If  BooleanExpression  Then  Statements  [  Else  Statements  ]  StatementTerminator

и "statements" определяется как

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

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

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

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

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

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

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

Ответ 2

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

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

Ответ 3

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

Ответ 4

Просто угадать

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

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

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


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

Ответ 5

В действительно старых БАЗИСНЫХ диалектах единственное, что могло последовать "ТОГДА", было номером строки. Многие диалекты улучшили это, позволив коду следовать "ТОНИМУ"; после разбора "THEN" они перейдут к следующей строке, если указанное условие было ложным или продолжалось с текущей строкой. Дальнейшие диалекты добавили возможность пропустить до конца или "ELSE", в зависимости от того, что наступило раньше; попытка выполнить инструкцию "ELSE" пропустит до конца строки.

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