我不确定我的问题是否与操作员优先级有关 - 只是为了排除我添加了额外的括号。我的理解是在这种情况下将执行每个括号中的代码。所以基本上所有的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)))
答案 0 :(得分:1)
为了使您的条件成立,a
必须为真,此外,b
或c
中的至少一个条件必须为真。
因此,如果a==true
和c==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