Почему короткое замыкание не является поведением по умолчанию в VB?

В VB есть операторы AndAlso и OrElse, которые выполняют замыкание логических соединение.

Почему это не поведение по умолчанию для выражений И и Или, поскольку сокращение полезно в каждом случае.

Как ни странно, это противоречит большинству языков, в которых && и || выполняют короткое замыкание.


person Robin Rodricks    schedule 28.01.2009    source источник


Ответы (3)


Поскольку команде VB приходилось поддерживать обратную совместимость со старым кодом (и программистами!)

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

Баллада об AndAlso и OrElse Центральный Паноптикум

Наша первая мысль заключалась в том, что логические операции гораздо более распространены, чем побитовые, поэтому мы должны сделать И и ИЛИ логическими операторами и добавить новые побитовые операторы с именами BitAnd, BitOr, BitXor и BitNot (последние два для полноты). Однако во время одной из бета-версий стало очевидно, что это довольно плохая идея. Пользователь VB, который забывает о существовании новых операторов и использует And, когда он имеет в виду BitAnd и Or, когда он имеет в виду BitOr, получит код, который компилируется, но дает "плохие" результаты.

person Robin Rodricks    schedule 28.01.2009
comment
На самом деле, можно было бы добавить короткое замыкание к побитовым операторам, не нарушая код, который не полагался бы на побочные эффекты, если бы правило состояло в том, что побитовый оператор или оценивал бы правый операнд, если только левый операнд не был равен all-bits-set значение типа результата. С другой стороны, некоторый существующий код — даже код, в котором оба операнда And или Or создаются реляционными операторами — действительно полагается на побочные эффекты вычисления обеих сторон булевых операторов. - person supercat; 29.05.2012
comment
Ссылка мертва, но содержание здесь. Спасибо! - person Kyle Trauberman; 05.12.2015
comment
Ссылка исправлена! Да здравствует ссылка! - person lance; 05.04.2020

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

  If x > y And y > z Then

  End If

Как показано в статье Пола Вика (см. ссылку, предоставленную Кеном Браунингом выше), идеальным сценарием, в котором полезно использовать короткое замыкание, является ситуация, когда объект сначала проверяется на существование, а затем оценивается одно из его свойств.

  If x IsNot Nothing AndAlso x.Someproperty > 0 Then

  End If

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

person Cerebrus    schedule 28.01.2009
comment
Но в вашем первом примере, если x‹y, просто нет смысла продолжать оценку. Единственный случай, который я могу придумать, когда мне не нужна оценка короткого замыкания, если я вызываю функции, которые определенно должны быть запущены. - person geekchic; 01.06.2012
comment
Короткое замыкание может не понадобиться, если два условия полностью исключают друг друга. Это тоже очень сильно зависит от намерений разработчиков. Если разработчик хочет, чтобы оба условия выполнялись, то существует запасной вариант, который заставит выполнить оба условия. В тех случаях, когда необходимо проверить существование объекта, на помощь приходит короткое замыкание. - person Amol Dixit; 01.01.2018

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

В некоторых языках, отличных от VB, логические операторы могут выполнять неявное короткое замыкание, но могут сначала оценивать правый оператор (в зависимости, например, от сложности выражений слева и справа от логического оператора).

person mouviciel    schedule 28.01.2009