C# 为什么我必须把三元运算符表达式放在布尔检查的括号内?
如果我有一个两部分的布尔检查,比如C# 为什么我必须把三元运算符表达式放在布尔检查的括号内?,c#,ternary-operator,boolean-logic,C#,Ternary Operator,Boolean Logic,如果我有一个两部分的布尔检查,比如a和&B,而不使用|,那么如果a为false,我希望检查立即为false。然而,如果B是一个三元运算符,情况似乎并非如此 var foo = false && false ? true : true; 在本例中,foo为真,可能是因为(&&Trimal)部分的功能更像| |。但是,如果我将三元检查用括号括起来,它将按预期工作: var bar = false && (false ?
a和&B
,而不使用|
,那么如果a为false,我希望检查立即为false。然而,如果B是一个三元运算符,情况似乎并非如此
var foo = false
&& false ? true : true;
在本例中,foo
为真,可能是因为(&&Trimal)部分的功能更像| |。但是,如果我将三元检查用括号括起来,它将按预期工作:
var bar = false
&& (false ? true : true);
在本例中,bar
为false
这种行为的原因/解释是什么?为什么我必须将三元运算符和结果表达式放在布尔检查中的括号内?第一个表达式实际上可以如下所示
var foo = (false && false) ? true : true;
第一个事实上可以理解为
var foo = (false && false) ? true : true;
您必须使用括号,因为三元运算符(
c?t:f
)的优先级低于条件and运算符(x&&y
),因此,当您组合它们时,优先级就像“不可见”括号:
(x && y) ? t : f
您可以在Microsoft文档的C#reference部分中看到按优先级列出的所有运算符。您必须使用括号,因为三元运算符(
C?t:f
)的优先级低于条件and运算符(x&&y
),因此当您将它们组合在一起时,优先级就像“不可见”一样括号:
(x && y) ? t : f
您可以在Microsoft文档的C#reference部分中看到按优先级列出的所有运算符。这是因为计算顺序,使用括号进行了更改。第一个代码实际上是:
var foo = (false && false) ? true : true;
这意味着:
if (false&&false)
foo=true;
else
foo=true;
二是:
var bar=false&&(false?true:true)代码>
也就是说
bool x
if (false)
x=true;
else
x=true;
if (false&&x)
bar=true;
else
bar=false;
一对括号可以改变一切。这是因为使用括号可以改变计算顺序。第一个代码实际上是:
var foo = (false && false) ? true : true;
这意味着:
if (false&&false)
foo=true;
else
foo=true;
二是:
var bar=false&&(false?true:true)代码>
也就是说
bool x
if (false)
x=true;
else
x=true;
if (false&&x)
bar=true;
else
bar=false;
一对圆括号可以改变一切。我认为facepalm可以涵盖一切。谢谢:我想是Dfacepalm把它盖上了。谢谢:DSee:-&&优先级高于?:请参阅:-&&优先级高于?: