【问题标题】:Increment Operator [duplicate]增量运算符 [重复]
【发布时间】:2023-03-26 01:53:01
【问题描述】:

我在一次测试中错过了这个问题 3 次。我似乎无法掌握如何解决这个问题。非常感谢任何帮助。

    public class Test {
         public static void main(String[] args) {
             int j = 0;
             int i = ++j + j * 5;

             System.out.println("What is i? " + i);
        }
    }

【问题讨论】:

  • 你有没有试过运行代码来确定我会有什么价值?
  • 它返回 6 的原因是 ++jpre-increment 这会将 j 的值增加到 1,并且它会“预先”计算该行,以便在计算该行时,j 的值已经是 1。而 1 + 1 * 5 = 6。
  • 真正的教训:永远不要写这种代码。
  • 感谢 alfasin - 现在有意义了!

标签: java operators increment


【解决方案1】:

为:

int i = ++j + j * 5;

变量j用表达式++j逐递增1,等于j+1,将j的值改为1。然后按照java中的运算顺序规则,乘法为在此阶段执行(j * 5)(1 * 5),因此当前i = 5。最后将乘积j 加上(j + 5)(1 + 5) = 6。

你可以查看这个页面,这里有一个简单的解释:

http://introcs.cs.princeton.edu/java/11precedence/

【讨论】:

    【解决方案2】:

    根据 Java 的运算符优先级和计算顺序,i 等于 6i 设置为等于 j,它预先递增到 1,并添加到其自身和 5 的乘积中,即 6。

    【讨论】:

      【解决方案3】:

      这里要注意的是j++++j 之间的区别。看到这个:The difference between ++Var and Var++

      记住这一点,++j 将返回 1,并将 j 的值更改为 1。所以下一部分,j*5 等于 1*5,即 5。所以总体而言,++j + j*5 给你 6。

      【讨论】:

        【解决方案4】:

        如果语句中出现++j,则j的值先递增,然后执行语句。但是如果 j++ 出现在语句中,则执行第一个语句,然后值递增。

        为了简单解决执行部分,你可以忽略++符号并简化它。但不要忘记递增和简化的顺序。

        【讨论】:

          【解决方案5】:

          Java 有一个operator precedence 规则,这意味着对于Java 中包含运算符的任何数学表达式,首先计算后缀(j++) 和前缀(++j)。还有left and right associativity,这是您的语句的解析方式。 +,-,/,* 等数学运算符具有从左到右的关联性。后缀和前缀具有从右到左的关联性。

          查看Java Grammar File会发现

          前缀增量表达式的值是 新值存储后的变量

          因此,对于当前语句,++j 为 1。

          后缀增量表达式的值是 在存储新值之前的变量。

          因此,对于当前语句,j++ 为 0。

          所以,前缀求值后的 (++j) + j * 5 变为 (1 + (1 * 5)) = 6。

          [编辑]

          因此,j++ + j * 5 这样的语句会给你 5 作为答案,因为 j 在 j++(后缀增量)之后变为 1,但 j++ 本身仍然为 0。

          【讨论】:

            【解决方案6】:

            根据java运算符优先级,++运算符的优先级高于+*运算符。下面是一步一步发生的事情:

            首先发生++j。由于j 为0,++jj 递增为1。 现在表达式++j + 5 * j 变成了1 + 5 * 1

            现在我们有两个运算符,+*。先应用哪一个?查看运算符优先级图表,您会发现 * 的优先级高于 + 。所以首先5 * 1首先发生。乘法后,表达式看起来像1 + 5

            1 添加到5,我们得到6。所以....i = 6 是结果。

            如果您想了解更多关于 ++ 运算符的信息,YouTube 上有一些不错的视频。

            【讨论】:

              猜你喜欢
              • 2012-11-23
              • 1970-01-01
              • 2016-02-02
              • 1970-01-01
              • 2019-09-25
              • 2013-06-06
              • 2017-07-06
              • 2017-06-23
              • 1970-01-01
              相关资源
              最近更新 更多