[英]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:逻辑或甚至不应该检查它后面的条件,如果它已经找到一个真
运算符优先级就是解决歧义。 例如,假设我们有两个运算符op1
和op2
以及以下表达式:
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
。
编译器是如何做出这个决定的? 让我们(简化)看一下步骤:
true
这已经是一个值。||
an 现在知道必须遵循另一个值或评估表达式。false
。 这将是一个值,但由于它可能是另一个表达式的一部分,它还没有完成。?
它将其标识为三元运算符||
它必须将整个表达式视为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.