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