C#如何计算没有括号的AND或表达式
不确定这是否有意义 我试图理解C#如何处理以下逻辑C#如何计算没有括号的AND或表达式,c#,.net,C#,.net,不确定这是否有意义 我试图理解C#如何处理以下逻辑 false && true || false false || true && false 基本上,我试图找出在没有括号的情况下C如何计算这些表达式。编译器会计算出来,因为标准指定了 这就是说,如果一个表达式需要你思考一秒钟以上的事情发生的顺序。。。使用括号表示清楚=)显示运算符优先级: false && true || false = (false && true) |
false && true || false
false || true && false
基本上,我试图找出在没有括号的情况下C如何计算这些表达式。编译器会计算出来,因为标准指定了 这就是说,如果一个表达式需要你思考一秒钟以上的事情发生的顺序。。。使用括号表示清楚=)显示运算符优先级:
false && true || false = (false && true) || false = false
false || true && false = false || (true && false) = false
&&
(逻辑AND)的优先级高于|
(逻辑OR)
注意:始终使用括号对逻辑表达式进行分组是一种好的做法(有些人可能会说是最佳做法),这样其目的就明确了……
&
的值高于|
,因此首先对其进行评估。实际上,它们相当于:
false && true || false => (false && true) || false => false
false || true && false => false || (true && false) => false
如果您不确定,请使用括号。它们没有真正的负面影响,任何使代码更具可读性的东西通常都是好事
也许更好的例子(因此结果不同)是:
true && false || false => (true && false) || false => false
true || false && false => true || (false && false) => true
操作员将按顺序进行评估 所以,基本上,
和
在或
s之前。您的示例与以下示例相同:
(false && true) || false
false || (true && false)
最重要的是。。。C#使用短路运算符。所以整件事都是假的
每个人都提到了运算符优先级和可以在其中查找的参考表。但我想给你一个如何记住它的提示。如果你把
false
看作0
和true
看作1
,那么&
就像乘法,|
就像加法(它们实际上被称为逻辑乘法和逻辑加法)。优先级关系是相同的:乘法高于加法。其工作原理相同:
0 * 0 == 0 | false && false == false
0 * 1 == 0 | false && true == false
1 * 0 == 0 | true && false == false
1 * 1 == 1 | true && true == true
0 + 0 == 0 | false || false == false
0 + 1 == 1 | false || true == true
1 + 0 == 1 | true || false == true
1 + 1 == 1* | true || true == true
(*)实际上是2加1
当有疑问时,通常使用括号。运算符优先级
短路评估
括号
从左到右。AND运算符的优先级高于OR运算符(请参阅)。始终首先计算含义(&E) 因此,
x&&y|z
被理解为(x&&y)|z
而
a | | b&c
被理解为a | |(b&c)不幸的是,这是一个糟糕的例子,因为无论你选择哪个优先级,它们的计算结果都是相同的:)这是一个相当糟糕的例子,因为((假与真)|假)==(假与(真与假)
(假与假)=((假与假与假)=(真)&&false)
@cHao:您似乎混淆了实际值和真实值之间的关系。我试图创建自己的逻辑来计算字符串表达式,只是为了好玩:),使用圆括号可能会容易得多,这是因为示例没有说明存在重要的差异。这就是问题所在。正如我(措辞拙劣)的回答试图弄清楚的那样……我认为指出c#使用短路“&&”运算符是很重要的。一旦初始值为false,评估就停止。虽然您的答案在覆盖运算符优先级方面是一个很好的解决方案,但我相信不要忘记这些细节是很重要的。已经有多个其他答案包含了多年来一直存在的所有这些信息。这个答案没有增加任何价值。