Существует ли представление с логическими операторами, которое возвращает тот же результат для тернарного оператора? - PullRequest
1 голос
/ 07 апреля 2020

Мне любопытно, существует ли логическое представление для троичного оператора, которое дает одинаковый результат для каждой комбинации условий. Я попробовал ниже, но это не охватывает все ситуации. Существует ли правильное представление для этой проблемы?

Ternary Condition : a ? b : c
Logical Version : (a && b) || c

Логическая версия дает сбой в одном условии по сравнению с троичными результатами, когда заданы следующие условия:

(true  && true)  || true  = true 
(true  && true)  || false = true 
(true  && false) || true  = true //must be false
(true  && false) || false = false 
(false && true)  || true  = true 
(false && true)  || false = false
(false && false) || true  = true
(false && false) || false = false

1 Ответ

1 голос
/ 07 апреля 2020

Если мы говорим о предварительно оцененных булевых переменных или константах, логический эквивалент троичного оператора можно записать так, как прокомментировал Ли

(a && b) || (!a && c)

Или, альтернативно,

(!a || b) && (a || c)

Однако Поскольку этот вопрос помечен как C#, я думаю, что важно обсудить случай, когда a, b или c на самом деле являются логическими выражениями с побочными эффектами (например, вызовом функции или средством получения свойств с поддержкой логики). c)

Итак, давайте сравним подходы в отношении того, как часто оцениваются a, b и c:

Случай 1: троичный оператор a ? b : c a вычисляется ровно один раз, и в зависимости от a, b или c оценивается один раз.

Случай 2: (a && b) || (!a && c) Количество оценок a для a=1 зависит от значения b. Обратите внимание, что #a - это число оценок для выражения a.

a   b   c   #a  #b  #c

0   0   0   2   0   1
0   0   1   2   0   1
0   1   0   2   0   1
0   1   1   2   0   1
1   0   0   2   1   0
1   0   1   2   1   0
1   1   0   1   1   0
1   1   1   1   1   0

Случай 3: снова (!a || b) && (a || c), число оценок a для a=1 зависит от b , но, наоборот, по сравнению со случаем 2

a   b   c   #a  #b  #c

0   0   0   2   0   1
0   0   1   2   0   1
0   1   0   2   0   1
0   1   1   2   0   1
1   0   0   1   1   0
1   0   1   1   1   0
1   1   0   2   1   0
1   1   1   2   1   0

я не рассматриваю побочный эффект оценки выражения, где оценка a изменяет значение последующих оценок, так как это, вероятно, не будет выполнено. c.

...