逻辑或和三元运算符评估顺序
Logical OR and ternary operator evaluation order
Here, operators with the highest precedence appear at the top of the table, those with the lowest appear at the bottom. Within an expression, higher precedence operators are evaluated first.
Logical OR || Left to right
Conditional ?: Right to left
示例:
if ( true || false ? false : true )
{
Console.WriteLine(String.Format("WHY?"));
}
我怎么看应该是:
true || (false ? false : true)
我认为它如何适用于我的情况:
(true || false) ? false : true
如果 条件 OR 的优先级高于 [=29,为什么条件永远不会满足=]三元运算符?
更新 1:
Look, the first and third condition are marked unreachable
UPD2:
逻辑 OR 甚至不应该检查它后面的条件,如果它已经找到一个 true
运算符优先级就是为了解决歧义。比方说,我们有两个运算符 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
已经是一个值。
- 编译器看到
||
现在知道必须跟随另一个值或计算的表达式。
- 然后编译器会看到
false
。这将是一个值,但由于它可能是另一个表达式的一部分,因此尚未完成。
- 接下来,编译器遇到
?
,它将其识别为三元运算符
- 由于三元的优先级低于
||
,因此它必须将整个表达式 true || false
视为三元的第一个操作数。
至于为什么三元运算符的优先级比||
低,我只能推测是为了一致性。三元不仅是唯一具有三个操作数的运算符,而且只有第二个和第三个需要具有相同的数据类型,而第一个始终是 bool
。较低的优先级确保这两个赋值在语义上相同:
bool b = condition1 || condition2 ? true : false;
int i = condition1 || condition2 ? 23 : 42;
Here, operators with the highest precedence appear at the top of the table, those with the lowest appear at the bottom. Within an expression, higher precedence operators are evaluated first.
Logical OR || Left to right
Conditional ?: Right to left
示例:
if ( true || false ? false : true )
{
Console.WriteLine(String.Format("WHY?"));
}
我怎么看应该是:
true || (false ? false : true)
我认为它如何适用于我的情况:
(true || false) ? false : true
如果 条件 OR 的优先级高于 [=29,为什么条件永远不会满足=]三元运算符?
更新 1: Look, the first and third condition are marked unreachable
UPD2: 逻辑 OR 甚至不应该检查它后面的条件,如果它已经找到一个 true
运算符优先级就是为了解决歧义。比方说,我们有两个运算符 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
已经是一个值。 - 编译器看到
||
现在知道必须跟随另一个值或计算的表达式。 - 然后编译器会看到
false
。这将是一个值,但由于它可能是另一个表达式的一部分,因此尚未完成。 - 接下来,编译器遇到
?
,它将其识别为三元运算符 - 由于三元的优先级低于
||
,因此它必须将整个表达式true || false
视为三元的第一个操作数。
至于为什么三元运算符的优先级比||
低,我只能推测是为了一致性。三元不仅是唯一具有三个操作数的运算符,而且只有第二个和第三个需要具有相同的数据类型,而第一个始终是 bool
。较低的优先级确保这两个赋值在语义上相同:
bool b = condition1 || condition2 ? true : false;
int i = condition1 || condition2 ? 23 : 42;