【问题标题】:operator precedence && and ||运算符优先级 && 和 ||
【发布时间】:2014-12-11 08:01:04
【问题描述】:
  • 请忽略这个问题 - 这是错误的

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

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)))

【问题讨论】:

  • 每对括号中的代码不是执行,而是求值。 'b 不可用'是什么意思?是0还是没有初始化?
  • 当 c 为 254 且 b 为“不可用”(这是什么意思?0?)时,您的条件的第二部分为假,则 (a == true) && false 导致假跨度>
  • b 初始化为零
  • 对于 a = true, c = 254,你的 false 结果是正确的。您究竟希望在 OR 集中评估为真?
  • 如果你的问题是错误的,你应该删除它。

标签: java operator-precedence


【解决方案1】:

首先评估a,如果(a == true)评估为true,那么只有它会执行下一个&amp;&amp;语句

((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,它就会从那里返回。

【讨论】:

  • yes .. 所以 a == true 和 b = 0(初始化值)并且 c 等于 254
【解决方案2】:

要使您的条件为真,a 必须为真,此外,bc 上的至少一个条件必须为真。

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

【讨论】:

  • 是的,这是真的。不,我希望条件仅在 c == 7825 且小于任何数字时才为真
  • @oneday 那么当 c 为 254 时,为什么您希望您的条件为真?
【解决方案3】:

如果代码写的更易读的话会简单很多;

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 中,您可以使用 Tuples 数组使#isWithinRange 更像#isEqualToAny

【讨论】:

    猜你喜欢
    • 2011-06-21
    • 2020-03-05
    • 2021-03-29
    • 2013-07-31
    • 1970-01-01
    • 2023-03-07
    • 2011-07-07
    相关资源
    最近更新 更多