【问题标题】:Does an If-else boolean expression (&&) increment a variable outside the if-else statements even if one of the expressions are false? [duplicate]If-else 布尔表达式 (&&) 是否会在 if-else 语句之外增加变量,即使其中一个表达式为假? [复制]
【发布时间】:2015-05-18 15:35:16
【问题描述】:

我在我的 Java 编程书中做练习,我遇到了这个:

假设x 为1。在对以下表达式求值后,x 是什么?

A)

(x >= 1) && (x++ > 1)

B)

(x > 1) && (x++ > 1)

我理解B),因为它首先测试(x > 1),这是错误的,所以它不测试(x++ > 1),因此不会增加x

但是,在 A) 上,(x >= 1) 是真的,所以它也会去(x++ > 1) 进行测试,但 (x++ > 1) 是假的。这是否意味着即使它为假,变量x = 1 仍在递增,因为表达式(x++ > 1) 已执行?

【问题讨论】:

  • 你为什么不在每个后面加上System.out.println(x)(虽然不是then子句的一部分,但它总是会发生)自己看看? :) 似乎很容易调查。接下来尝试使用& 并查找短路评估。
  • 你说得对,我确实把 system.out.println(x) 放在我为它做的 if else 语句之后,我没有意识到我可以在那里解决我自己的问题,我只是想弄清楚为什么当布尔表达式为假时它仍然会增加它。

标签: java


【解决方案1】:

A) x >= 1 为真,x++ > 1 为假,但 x 会变成 2

【讨论】:

    【解决方案2】:

    为了能够评估 x++ 是否低于 1,它需要评估表达式 x++,所以这似乎是合理的,是的。如果要计算的表达式有副作用,它们将被调用。

    【讨论】:

      【解决方案3】:

      如果不评估表达式,任何人都找不到结果。所以你的答案是,因为你的表达式 (x++ > 1) 被执行了。

      【讨论】:

        【解决方案4】:

        java 中的这些条件是shortfail,这意味着只评估所需的最少条件。在 B.) 第一个条件是假的,运算符是 && 所以整个表达式无论如何都是假的。无需执行第二个。

        在 A.) 第一个表达式为真,因此必须执行第二个表达式以确定整个表达式的结果。

        【讨论】:

          【解决方案5】:

          您正在使用后缀增量运算符,这意味着它将在计算表达式后增加变量的值。如果你这样做:

          if ((x >= 1) && (++x > 1)) {
              System.out.println("hello");
          } 
          

          这是真的,因为我使用前缀递增运算符(先递增然后求值)。

          【讨论】:

            【解决方案6】:

            (x++ > 1) 几乎等于 (x=(x+1) > 1)。不同之处在于 x 在初始值测试 (x > 1) 后递增。 因此,无论测试结果是真还是假,x都会在两种情况下递增。

            【讨论】:

            • 声明(x++ > 1) is almast equal to (x=(x+1) > 1) 是错误的。 x++x=(x+1) 不同,您必须使用 ++x
            • 我没有说 x++ 与 x=x+1 相同,而是使用了“几乎”这个词来解释不同之处。
            • 但在这种情况下确实会有所不同,因为如果您使用x=x+1 而不是x++,则整个条件都是正确的。
            • 我应该在我的帖子中使用引号以避免误解。我回答了这个问题“即使它是错误的,变量 x = 1 仍在递增,因为表达式 (x++ > 1) 已执行?”。这是关于why x=2 after expression 而不是what is the result of the expression itself。从这个意义上说,我的回答是正确的。无论如何,感谢您的修改。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-10-26
            • 2011-02-01
            • 2018-01-21
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多