Ошибка открытого ключа SSH

Под 'замыканием' они подразумевают, что если бы у вас было выражение типа:

( 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 является четным, это приведет к короткому замыканию присваивания на "нечетное" - присваивание никогда не произойдет, потому что выражение не будет оценено, так как результат уже известен как истинный к тому времени, когда он достигнет ||, поэтому результат останется "четным".

1
06.01.2019, 23:18
0 ответов

Теги

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