【问题标题】:Is there a representation with logical operators that returns the same result for ternary operator?是否存在与三元运算符返回相同结果的逻辑运算符表示?
【发布时间】:2020-07-19 17:50:57
【问题描述】:

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

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

【问题讨论】:

  • 为什么一定是假的? (true && false) || true(false) || true = true
  • 因为我们希望它给出相同的三元条件结果,即 'true ?假:真=假'
  • 哦,我现在明白了 :)
  • 三元运算符就像一个短的ifbc 不必是布尔值。 b 是表达式 a 返回 truec 如果 a 返回 false 的返回值。所以逻辑版本没有意义。请提供有关您希望使用此逻辑实现什么的更多信息。
  • (a & b) | (!a & c) 是直接翻译,我认为没有比这更简单的了。

标签: c# logical-operators conditional-operator


【解决方案1】:

如果我们谈论预先计算的布尔变量或常量,则可以像 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 的评估会改变后续评估的值,因为它可能会跑题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-21
    • 2014-03-18
    • 1970-01-01
    • 2020-04-14
    • 2014-07-09
    • 2015-09-21
    • 1970-01-01
    相关资源
    最近更新 更多