为什么我必须在布尔检查中将三元运算符表达式放在括号中?
Why do I have to put a ternary operator expression in brackets inside a boolean check?
如果我有像 A && B
这样的两部分布尔检查而不使用任何 ||
那么我希望如果 A 为假,则检查立即为假。但是,如果 B 是三元运算符,则情况似乎并非如此。
var foo = false
&& false ? true : true;
foo
在这个例子中是 true,大概是因为(&& 三元)部分在某种程度上更像 ||。但是,如果我用方括号括起三元检查,它会按预期工作:
var bar = false
&& (false ? true : true);
bar
在这个例子中是 false。
此行为的 reason/explanation 是什么?为什么我必须在布尔检查中将三元运算符和生成的表达式括在括号中?
第一个居然可以这样读
var foo = (false && false) ? true : true;
您必须使用括号,因为三元运算符 (c ? t : f
) 的优先级低于条件运算符和运算符 (x && y
),因此当您组合它们时,优先级类似于 "invisible" 括号:
(x && y) ? t : f
您可以在 Microsoft 文档的 C# 参考部分 Operator precedence 部分看到按优先级列出的所有运算符。
因为计算的顺序,用括号改变了。第一个代码实际上是:
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;
一对括号改变一切。
如果我有像 A && B
这样的两部分布尔检查而不使用任何 ||
那么我希望如果 A 为假,则检查立即为假。但是,如果 B 是三元运算符,则情况似乎并非如此。
var foo = false
&& false ? true : true;
foo
在这个例子中是 true,大概是因为(&& 三元)部分在某种程度上更像 ||。但是,如果我用方括号括起三元检查,它会按预期工作:
var bar = false
&& (false ? true : true);
bar
在这个例子中是 false。
此行为的 reason/explanation 是什么?为什么我必须在布尔检查中将三元运算符和生成的表达式括在括号中?
第一个居然可以这样读
var foo = (false && false) ? true : true;
您必须使用括号,因为三元运算符 (c ? t : f
) 的优先级低于条件运算符和运算符 (x && y
),因此当您组合它们时,优先级类似于 "invisible" 括号:
(x && y) ? t : f
您可以在 Microsoft 文档的 C# 参考部分 Operator precedence 部分看到按优先级列出的所有运算符。
因为计算的顺序,用括号改变了。第一个代码实际上是:
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;
一对括号改变一切。