Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么我必须把三元运算符表达式放在布尔检查的括号内?_C#_Ternary Operator_Boolean Logic - Fatal编程技术网

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:-&&优先级高于?:请参阅:-&&优先级高于?: