Все языки программирования имеют булеву оценку короткого замыкания?

Разграничение AOP и транзакции является соответствием, сделанным на небесах. Мы используем AOP Spring @Transaction аннотации, он делает для более легкого и более интуитивного tx-разграничения, чем я когда-либо видел где-нибудь еще.

38
задан Kim Stacks 13 January 2013 в 03:13
поделиться

15 ответов

Это называется оценкой короткого замыкания .

Обычно это верно для языков, производных от C (C, C ++, Java, C #), но не для всех

Например, VB6 не делает этого, и этого не было в ранних версиях VB.NET. VB8 (в Visual Studio 2005) представил для этой цели операторы AndAlso и OrElse .

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

Также следует отметить, что оценка (или отсутствие таковой) короткого замыкания имеет свои опасности, о которых следует знать. Например, если второй операнд является функцией, имеющей какие-либо побочные эффекты, тогда код может работать не так, как задумал программист.

66
ответ дан 27 November 2019 в 03:00
поделиться

Coldfusion изначально выполняет краткосрочную оценку. Я уверен, что все разработчики CF написали:

<cfif isdefined("somevariable") and somevariable eq something>
//do logic
</cfif>
1
ответ дан 27 November 2019 в 03:00
поделиться

Это называется оценкой короткого замыкания и является общим для всех языков с которыми я когда-либо работал (C, C ++, C #, Java, Smalltalk, Javascript, Lisp), кроме VB, VB.NET и Fortran.

На самом деле это довольно полезная функция. Без короткого замыкания вы не смогли бы этого сделать:

if (a != null && a.isBlank())

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

2
ответ дан 27 November 2019 в 03:00
поделиться

Большинство языков (все, что я видел) используют оценку короткого замыкания для УСЛОВНЫХ операторов, таких как && и ||. Они прекратят оценку, как только одно из условий удовлетворяет требованию. (Первая ложь на &&. Первая истина на ||)

Все БИНАРНЫЕ операторы, такие как & и |, обрабатываются. (Исходный)

Обрабатываются все БИТСТРЕННЫЕ операторы, такие как & и |. (Изменить: 5/10/17)

2
ответ дан 27 November 2019 в 03:00
поделиться

В Erlang операторы и и или не выполняют оценку короткого замыкания; вы должны использовать операторы orrelse и , а также , если вам нужно поведение короткого замыкания.

2
ответ дан 27 November 2019 в 03:00
поделиться

Это верно и для Java, но операторы | и т.д. будут оценивать обе стороны.

2
ответ дан 27 November 2019 в 03:00
поделиться

Microsoft VBScript (часто используемый в сочетании с «классическим» ASP) не имеет оценки короткого замыкания для логических операторов, вместо этого используется побитовая оценка. Это одна из многих причин, по которым это, возможно, худший язык на свете!

«Дело в том, что VBScript - это не логично. VBScript является побитовым. Все так называемые логические операторы работают на числах, а не на логических значениях! Not, And, Or, XOr, Eqv и Imp все преобразовать свои аргументы в четырехбайтовые целые числа, выполните логическую операцию над каждая пара битов в целых числах и вернуть результат. Если True равно -1 и False равно 0, тогда все работает, потому что -1 все его биты включены и 0 все биты отключены. Но если другие числа попадут туда, все ставки отменены ».

Взято из этого блога. Эрика Липперта.

4
ответ дан 27 November 2019 в 03:00
поделиться

В Аде есть специальные сокращенные формы условных выражений:

and then
or else

используется следующим образом:

if p.next /= null and then p.next.name = 'foo'
if x = 0 or else 1/x = y

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

7
ответ дан 27 November 2019 в 03:00
поделиться

Это верно для языков, которые являются «потомками» C: PHP, Java, C ++, C #, ... или в том же «вдохновении», как Perl.

Но это неверно для VB (по крайней мере, до .NET, который ввел для этого новые ключевые слова).
(И это действительно беспокоит вас, когда вы впервые работаете с VB ^^)

5
ответ дан 27 November 2019 в 03:00
поделиться

В исходной версии Паскаля этого не было, что вызвало много горя. Современные Паскали, такие как Delphi, работают так же, как C и др.

8
ответ дан 27 November 2019 в 03:00
поделиться

Это называется оценкой короткого замыкания , и большинство языков это делают. В некоторых языках существуют операторы, которые этого не делают.

12
ответ дан 27 November 2019 в 03:00
поделиться

Верно ли это для ВСЕХ языков, таких как JAVA, C # и т. Д.?

В C # это верно только для короткозамкнутых операторов ' || ' и ' && '; если вы просто используете « | » или « & », он будет оценивать обе стороны каждый раз.

14
ответ дан 27 November 2019 в 03:00
поделиться

Это неверно для VB6.

В VB.net вам нужно использовать «AndAlso» вместо «And», если вы хотите пропустить вычисление второго выражения.

20
ответ дан 27 November 2019 в 03:00
поделиться

В Delphi это опция компилятора.

3
ответ дан 27 November 2019 в 03:00
поделиться

MATLAB - это один язык, который различает «стандартные» логические операторы и операторы короткого замыкания :

  • & (оператор AND) и | (Оператор ИЛИ) может работать с массивами поэлементно.
  • && и || являются версиями с коротким замыканием, для которых второй операнд оценивается только тогда, когда результат не полностью определяется первым операндом. Они могут работать только с скалярами , но не с массивами.
1
ответ дан 27 November 2019 в 03:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: