Как оценивается условный (тернарный) оператор? [closed]

La mejor y más sencilla solución fue :Jupyter Notebook (para ejecutar el código en otra máquina )+ acceso SSH (+ uso del protocolo de transferencia de datos )+ uso de TF para asignar GPU.

-8
21.01.2017, 01:43
2 ответа

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

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

4
28.01.2020, 05:21

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

Для || и && это означает, что в x = (true || send_mail()) вызов send_mail() пропускается, потому что операнды оцениваются слева направо и true or'd с чем-либо приводит к true.

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

Поэтому x = (ask_user() ? try_send_mail() : try_send_letter()) выполняет только try_send_mail() или try_send_letter(), но никогда оба сразу.

-1
28.01.2020, 05:21

Теги

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