逻辑或和三元运算符评估顺序

时间:2020-04-09 11:25:06

标签: c# operator-precedence

在此,优先级最高的运算符出现在表格的顶部,而优先级最低的运算符出现在表格的底部。在表达式中,优先级较高的运算符将首先被求值。

逻辑或||从左到右

视情况而定?:从右到左

示例:

true || (false ? false : true)

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

在我的情况下,我认为它如何工作: Tools -> Options -> Xamarin -> iOS Settings -> Archives

为什么 条件OR 的优先级高于 三元 运算符,为什么该条件将永远无法满足?

UPD1: Look, the first and third condition are marked unreachable

UPD2: 如果逻辑“或”已经找到一个真,则甚至不应检查其后的条件

1 个答案:

答案 0 :(得分:1)

操作员的优先级全在于解决歧义。例如,假设我们有两个运算符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. 编译器发现||现在知道必须遵循另一个值或评估表达式。
  3. 然后,编译器将看到false。这将是一个值,但是由于它可能是另一个表达式的一部分,因此尚未完成。
  4. 接下来,编译器遇到?,它将其识别为三元运算符
  5. 由于三元组的优先级比||低,因此必须将整个表达式true || false视为三元组的第一个操作数。

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

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