Под 'замыканием' они подразумевают, что если бы у вас было выражение типа:
( something evaluating to false) && (something else)
Оно никогда не выполнило бы ничего в (что-то еще)
- оно бы немедленно завершилось, потому что false && anything
всегда будет false.
Аналогично:
(something evaluating to true ) || (something else)
Нет смысла оценивать (что-то еще)
, потому что условие уже истинно.
Что касается троичного оператора A ? b : c
Только A
является булевым выражением. На основании его значения будет вычислено либо b
, либо c
(b
, если A
истинно, иначе c
). Таким образом, здесь не происходит "замыкания", как в операторах &&
и ||
. Никогда не существует условия, при котором будут выполнены и b
, и c
, это всегда будет одно или другое.
Можно представить себе троичный оператор как оператор if-else. В приведенном выше примере A
- это условное выражение, b
- пункт then
, а c
- пункт else
. Разница лишь в том, что все троичное выражение будет иметь значение b
или c
, в зависимости от того, истинно или ложно A
.
Вот пример на языке Си. Допустим, мне нужна строка, указывающая, является ли число N
четным или нечетным:
char *result = ((N % 2) == 0) ? "even" : "odd";
Вот способ сделать это с помощью "короткого замыкания" (не очень хороший стиль, но он демонстрирует концепцию):
char *result = "even";
((N % 2) == 0) || (result = "odd");
В этом последнем примере, если N
является четным, это приведет к короткому замыканию присваивания на "нечетное" - присваивание никогда не произойдет, потому что выражение не будет оценено, так как результат уже известен как истинный к тому времени, когда он достигнет ||
, поэтому результат останется "четным".