是否存在逻辑运算符的表示法,该表示法会为三元运算符返回相同的结果



我很好奇是否存在三元运算符的逻辑表示,它为每个条件组合提供相同的结果。我在下面试过了,但并不能涵盖所有情况。这个问题有正确的表述吗?

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

如果我们谈论预先求值的布尔变量或常量,那么可以像Lee评论的一样编写与三元运算符等价的逻辑

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

或者作为

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

然而,由于这个问题被标记为C#,我认为讨论abc实际上是具有副作用的布尔表达式(如函数调用或具有支持逻辑的属性getter(的情况很重要

因此,让我们比较关于abc的评估频率的方法:

情况1:三元运算符a ? b : ca精确求值一次,根据abc求值一次。

情况2:(a && b) || (!a && c)aa=1的评估次数取决于b的值。注意,#aa表达式的求值次数。

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)同样,aa=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的评估会改变后续评估的值,因为这可能会偏离主题。

最新更新