繁体   English   中英

逻辑 OR 和三元运算符求值顺序

[英]Logical OR and ternary operator evaluation order

在这里,具有最高优先级的运算符出现在表格的顶部,那些具有最低优先级的出现在底部。 在表达式中,首先计算优先级较高的运算符。

逻辑或 || 左到右

有条件的?:从右到左

例子:

if ( true || false ? false : true )
{
     Console.WriteLine(String.Format("WHY?"));
}

我怎么看应该是: true || (false? false: true) true || (false? false: true)

我认为它在我的情况下如何工作:( (true || false)? false: true (true || false)? false: true

如果条件 OR三元运算符具有更高的优先级,为什么条件永远不会满足?

UPD1:看,第一个和第三个条件都标记为不可达

UPD2:逻辑或甚至不应该检查它后面的条件,如果它已经找到一个真

运算符优先级就是解决歧义。 例如,假设我们有两个运算符op1op2以及以下表达式:

x = a op1 b op2 c

我们可以在逻辑上解决这个问题

tmp = a op1 b
x = tmp op2 c

但也可以先评估op2 ,如下所示:

tmp = b op2 c
x = a op1 tmp

这是模棱两可的。 为了解决歧义,我们可以要求使用括号,或者必须赋予其中一个运算符更高的优先级。 这与我们在数学中使用的表达式基本相同,例如1 + 2 * 3 ,其中乘法具有更高的优先级并且必须首先计算。

笏这对你的例子意味着什么? 正如你已经写过的, || 优先级高于?: 这意味着

true || false

将首先被评估并且总是结果为true 所以你的三元有效地变成

true ? false : true

并且总是会导致false

编译器是如何做出这个决定的? 让我们(简化)看一下步骤:

  1. 最初,编译器看到true这已经是一个值。
  2. 编译器看到|| an 现在知道必须遵循另一个值或评估表达式。
  3. 然后编译器看到false 这将是一个值,但由于它可能是另一个表达式的一部分,它还没有完成。
  4. 接下来,编译器遇到? 它将其标识为三元运算符
  5. 因为三元的优先级低于|| 它必须将整个表达式视为true || false true || false作为三进制的第一个操作数。

至于为什么三元运算符的优先级低于|| 我只能推测这是为了一致性。 三元不仅是唯一具有三个操作数的运算符,而且只有第二个和第三个需要具有相同的数据类型,而第一个始终是bool 较低的优先级确保这两个赋值在语义上是相同的:

bool b = condition1 || condition2 ? true : false;
int i = condition1 || condition2 ? 23 : 42;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM