【问题标题】:Evaluation of && boolean operator&& 布尔运算符的评估
【发布时间】:2012-03-13 05:42:05
【问题描述】:

如果我有以下 if 语句

if ( (row != -1) && (array[row][col] != 10) ) {
    ....
}

其中rowint 值,arrayint[][] 对象。

我的问题是,如果 row = -1 会抛出异常,因为数组没有 -1 字段,那么是否会出现越界异常?或者它会在 if 的第一部分停止, (row!=-1) 并且因为那是错误的,所以它会忽略其余部分? 或者为了确保它不会抛出异常,我应该将上面的 if 语句分成两部分?

(请不要告诉我自己检查一下:)我在这里问是因为我也想问一个后续问题......)

【问题讨论】:

  • 如果计算结果为假,它将在第一个条件下停止
  • Java 是一种对逻辑运算符具有短路功能的编程语言,因此它可以按您的预期工作。 VB 和 SQL 是没有此功能的语言,这意味着您必须使用不同的方法来避免越界异常。
  • 它将在第一次测试时停止,而不是尝试第二次测试。

标签: java if-statement


【解决方案1】:

它会在抛出异常之前安全停止

&& 是一个short-circuiting boolean operator,这意味着一旦有一部分返回 false,它将停止执行表达式(因为这意味着整个表达式必须为 false)。

请注意,它还保证按顺序计算表达式的各个部分,因此在此类情况下使用是安全的。

【讨论】:

  • 我猜如果我有多个像上面这样的语句,用 OR 运算符 || 分隔,它仍然不会抛出异常......因为每个 && 都会单独短路?我的意思是如果 ( (&&) || (&&) )
  • 正确....只要每个子语句短路成功就可以了。
【解决方案2】:

它不会抛出异常。但是,如果 row

【讨论】:

    【解决方案3】:

    它将在 if 的第一部分停止。 Java 使用short circuite evaluation

    【讨论】:

      【解决方案4】:

      不,不会。如果第一个表达式为假,编译器将不会检查第二个表达式...这就是为什么 && 被称为“短路”运算符...

      【讨论】:

        【解决方案5】:

        通过&& 调用short-circuit evaluation,如果行检查失败,则没有继续评估的意义。

        【讨论】:

          【解决方案6】:

          当第一个表达式返回 false 用于 AND 测试和 true 用于 OR 测试时,大多数编程语言都会缩短测试。在您的情况下,AND 测试将被短路,不会发生异常。

          【讨论】:

            【解决方案7】:

            许多编程语言都有short-circuit evaluation 用于逻辑运算符。

            在诸如A and B 之类的语句中,该语言将首先评估A。如果A 为假,则整个表达式为假; B是真还是假都没有关系。

            在您的情况下,当row 等于-1 时,row != -1 将为 false,并且不会计算数组表达式的短路。

            另外,关于数组索引行为的第二个问题完全取决于语言。在 C 中,array[n] 表示 *(array + n)。在 python 中,array[-1] 为您提供数组中的最后一项。在 C++ 中,您可能有一个带有重载 [] 运算符的数组,该运算符也接受负索引。在 Java 中,你会得到一个ArrayIndexOutOfBoundsException

            【讨论】:

              【解决方案8】:

              此外,您可能需要以下内容(或仅使用 try/catch)。

              boolean isItSafe(int[][] a, int x, int y) {
                  boolean isSafe = true;
                  if (a == null || a.length == 0 || x >= a.length || x < 0 || y < 0 || y >= a[0].length ) {
                      isSafe = false;
                  }
                  return isSafe;
              }
              

              【讨论】:

                猜你喜欢
                • 2017-05-24
                • 2016-09-13
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2016-02-12
                • 1970-01-01
                相关资源
                最近更新 更多