我很好奇是否存在三元运算符的逻辑表示,它为每个条件组合提供相同的结果。我在下面试过了,但并不能涵盖所有情况。这个问题有正确的表述吗?
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#,我认为讨论a
、b
或c
实际上是具有副作用的布尔表达式(如函数调用或具有支持逻辑的属性getter(的情况很重要
因此,让我们比较关于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
的评估会改变后续评估的值,因为这可能会偏离主题。