在此,优先级最高的运算符出现在表格的顶部,而优先级最低的运算符出现在表格的底部。在表达式中,优先级较高的运算符将首先被求值。
逻辑或||从左到右
视情况而定?:从右到左
示例:
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: 如果逻辑“或”已经找到一个真,则甚至不应检查其后的条件
答案 0 :(得分:1)
操作员的优先级全在于解决歧义。例如,假设我们有两个运算符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;