运算符优先级&&和||

时间:2014-12-11 08:01:05

标签: java operator-precedence

  • 请忽略这个问题 - 错误

我不确定我的问题是否与操作员优先级有关 - 只是为了排除我添加了额外的括号。我的理解是在这种情况下将执行每个括号中的代码。所以基本上所有的OR操作都会发生,并且它的输出将被设置为条件a。 我有以下参数集a = true和c = 254,b不可用(b初始化为0 - 在任何给定时间b或c只能使用)。因此,对于上述情况,我期待条件导致真,但它会导致错误的条件。有什么理由吗?还有什么是调试诸如确切条件出错的地方的最佳方法 - 任何指针

if ((a == true) && ((b == 460) || (b == 454) || (b == 455) || 
            (c> 13568 && c< 14335) || 
            (c> 10640 && c< 10655) ||
            (c> 11296 && c< 11311) || 
            (c> 25600 && c< 26111) || (c== 7825)))

3 个答案:

答案 0 :(得分:1)

为了使您的条件成立,a必须为真,此外,bc中的至少一个条件必须为真。

因此,如果a==truec==254,您将获得false,因为c不在您允许的任何范围内,并且如您所说,{ {1}}不可用(我假设它意味着它没有您允许的3个值之一)。

答案 1 :(得分:1)

评估第一个a,如果(a == true)评估为true,则只会执行下一个&&语句

((b == 460) || (b == 454) || (b == 455) || 
            (c> 13568 && c< 14335) || 
            (c> 10640 && c< 10655) ||
            (c> 11296 && c< 11311) || 
            (c> 25600 && c< 26111) || (c== 7825))

在此内部,它将检查true的任何一个条件,一旦遇到任何一个语句true,它就会从那里返回。

答案 2 :(得分:0)

如果以更易读的方式编写代码会更简单;

bool isEqualToAny(int valueToCheck, int[] listToCheckIn){
    boolean isMatch = false;
    (for item in listToCheckIn){
       if (item == valueToCheck){
          isMatch = true;
          break;
       }
    }
}

bool isWithinRange(int valueToCheck, int min, int max){
    return (valueToCheck > min && valueToCheck < max);
}

if ((a == true) 
   && (isEqualToAny(b, int[]{460,454,455}) 
   || isWithinRange(c,3568,14335) 
   || isWithinRange(c,10640,10655) 
   || isWithinRange(c,11296,11311) 
   || isWithinRange(c,25600,26111) 
   || isWithinRange(c,10640,10655)
   || (c== 7825)))

在java8中,您可以使用元组数组使#isWithinRange更像#isEqualToAny