我正在阅读一些旧代码并遇到一个不合格的布尔表达式,如下所示:
if (first && second || third)
{
// do something
}
有两种有效的方法来限定该表达。
if ((first && second) || third)
和
if (first && (second || third))
对第一,第二和第三的某些值进行不同的评估。
我在C#中尝试了这一点,结果与第一个资格认证方法一致。好奇心变得更好,我也在Java中尝试过,这与第二种方法一致。为什么是这样?不同语言的评价是否应该相同?
答案 0 :(得分:6)
Java和C#在&&
之前评估||
,因为逻辑AND在两种语言中都有更高的优先级:
我认为您错误地运行了测试。
正如您通过运行Java
所看到的那样class Test {
public static void main (String[] args) {
boolean a = true;
boolean b = true;
boolean c = false;
System.out.println(a || b && c);
System.out.println((a || b) && c);
System.out.println(a || (b && c));
}
}
和C#
using System;
public class Test
{
public static void Main()
{
bool a = true;
bool b = true;
bool c = false;
Console.WriteLine(a || b && c);
Console.WriteLine((a || b) && c);
Console.WriteLine(a || (b && c));
}
}
Ideone上的演示,两者都产生相同的输出:
true false true
这表明&&
在两种语言中||
之前都会进行评估。