代码之家  ›  专栏  ›  技术社区  ›  user1400915

带替换的后增量

  •  -2
  • user1400915  · 技术社区  · 6 年前

    我在这里已经有一个自己的问题了,但我想再问一次 Post increment with example

    char a = 'D';
    int b = 5;
    System.out.println(a++/b+--a*b++);
    

    因为问题的答案之一是:

    (68 / 5) + (68 * 5) 而b++对此没有影响。

    我怀疑如果b++没有效果,那么为什么a++有效果呢? 理想情况下应该是

    步骤1: (68/b+--a*b++);

    现在a=69;

    步骤2: (68/b+--a*5)

    现在a=69; b=6;

    步骤3: (68/b+68*5)

    步骤4: (68/6+68*5)

    答案是351,但答案是353

    2 回复  |  直到 6 年前
        1
  •  3
  •   Andreas dfa    6 年前

    别糊涂了 evaluation order 具有 precedence 是的。

    评估令规定 操作数 总是被执行 从左到右 是的。

    优先权声明 * / 操作员 应用于 + - ,除非被括号覆盖。

    所以,你说得对 a++/b+--a*b++ 方法 (a++ / b) + (--a * b++) . 那是 优先 是的。

    自数值运算符 promote values to int (在这种情况下),你说得对 char a = 'D' 相当于 int a = 68 .

    所以:

    (a++ / b) + (--a * b++)    a = 68   b = 5
    (68  / b) + (--a * b++)    a = 69   b = 5
    (68  / 5) + (--a * b++)    a = 69   b = 5
    (68  / 5) + (68  * b++)    a = 68   b = 5
    (68  / 5) + (68  * 5  )    a = 68   b = 6
    13        + 340            a = 68   b = 6
    353                        a = 68   b = 6
    

    如你所见, b++ 是否有影响:对 b 之后 执行表达式。

        2
  •  -1
  •   mehran monster    6 年前

    第四步:(68/6+68*5)你错了! 在计算中,b在所有位置都是5,而不是6。

    所以我们有:

    第四步:(68/5+68*5)=(13+340)=353