[英]Operator precedence and associativity in C#
我有两行编码,如下所示
int? i = 1;
int j = i ?? 2 +1;
now "j is 1"
int? i = 1;
int j = (i ?? 2) +1;
now "j is 2"
你能解释一下吗?
当然-这只是一个优先事项。 (Microsoft)C#规范在7.3.1节中列出了运算符的优先级(无论如何,在C#4和C#5规范中;在C#3规范中为7.2.1),尽管这实际上只是一个信息量大的表-它实际上受语法。
无论如何,空值运算符( ??
)的优先级低于二进制加法运算符( +
)的优先级,因此您的第一个代码等效于:
int? i = 1;
int j = i ?? (2 + 1);
由于i
的值不为null,因此甚至不评估null运算符的右操作数i ?? (2 + 1)
的结果i ?? (2 + 1)
i ?? (2 + 1)
只是1。
将其与您的第二个示例进行比较,在该示例中,null-coalescing运算符表达式再次求值为1,然后将1加到该结果中。 有效的是:
int tmp = i ?? 2; // tmp is now 1
int j = tmp + 1; // j is 2
关联在这里无关紧要,只有在操作数出现在两个具有相同优先级的运算符之间时,它才控制顺序/分组。
方案1:
int? i = 1;
int j;
if (i != null)
{
//i is not null so this is hit
j = i;
}
else
j = 2 + 1;
}
所以j = 1
方案2:
int? i = 1;
int j;
if (i != null)
{
//i is not null so this is hit
j = i;
}
else
j = 2;
}
所以j = 1
//No matter the result of the above if, 1 is always added.
j = j + 1;
所以j = 2
int? i = 1;
int j = i ?? 2 + 1; //If I is null make j = to 3
现在j是1
int? i = 1;
int j = (i ?? 2) + 1; //If I is null make j = 2 else make j = to 0 and then add 1
现在j是2
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.