【问题标题】:operation on post++ and --pre operator对 post++ 和 --pre 运算符的操作
【发布时间】:2015-08-09 07:22:37
【问题描述】:

我想知道post 和pre 的递增和递减操作。

我在Java 中知道post operator 的优先级是high 和associativity 是left-to-right。而pre 运算符的关联性是right-to-left

Oracle Java Tutorial

但我的代码显示了不想要的结果-

public class Bunnies { 
    static int count = 3; 
    public static void main(String[] args) { 

        System.out.println(--count*count++*count++);//out put is 12 expected 48
        //associativity of post is higher so should be evaluated like this-

        //--count*3**count++  count is 4 now
        //--count*3*4         count is 5 now
        //4*3*4=48


        count = 3;
        System.out.println(--count*++count*++count); //out put is 24 expected 120
        //associativity of pre  is right to left so should be evaluated like this-

        //--count*++count*4      count is 4 now
        //--count*5*4            count is 5 now
        //4*5*4=120


        count = 3;
        System.out.println(-- count*count++);// out put is 4 expected 9

        //--count*3      count is 4 now
        //3*3=9 
         }
}

【问题讨论】:

  • 我正在检查这些 post 和 pre 是如何工作的。不是实时应用程序的一部分。我在 C 中很正常,这些操作员在 java 中购买时想知道我。
  • 您应该信任并引用 Java 语言规范,而不是任何其他文档,包括 Java 教程。
  • 当你有 --Number 时,数字会先减少然后执行下一个操作。当你有 Number++ 时,就会执行操作,然后 Number 会增加
  • 图是C++,不是Java...
  • @ِAllloush我正在关注oracle文档docs.oracle.com/javase/tutorial/java/nutsandbolts/…

标签: java operators operator-precedence associativity


【解决方案1】:

子表达式的求值顺序与关联性和优先级无关。

乘法的子表达式是从左到右计算的,因此在执行--count*count++*count++ 时,您先计算--count,然后计算count++,最后计算count++。

并且由于首先评估 pre 运算符,--count 将在评估之前递减。同样,由于 post 运算符最近被评估,count++ 将在评估后递增。

优先级仅有助于编译器创建正确的抽象语法树。
例如,在执行++count*2 时,编译器使用优先级来知道表达式是(++count)*2 而不是++(count*2)。同样,在执行++count*count-- 时,表达式为(++count)*(count--) 而不是(++(count * count))-- 或其他。但是,在乘法计算期间,++count 在 count-- 之前计算。

希望对你有帮助:)

我刚刚找到了一个关于 C# 和 Java 中的表达式求值的好答案here,享受:)

【讨论】:

  • 多重化的作用只出现在pre和post之后,因为它们的优先级更高,这对查询没有帮助。
  • @dubey-theHarcourtians 您误解了优先级是什么,并将其与评估混淆。在执行++count*2 时,编译器会创建一个 AST(抽象语法树)来评估表达式,并使用优先级来构建这棵树。 pre(或post)运算符的优先级更高,因此它将在乘法之前应用,但乘法仍然是从左到右计算的。查看我的编辑:)
  • 是的@Nizil 无论是 * 评估的 rl 还是 lt 结果都是相同的。但是可用于乘法的值将根据 post 和 pre 运算符进行评估。
  • @dubey-theHarcourtians 看看this answer :)
  • 这并不意味着我们正在使用乘法,因此评估 lr.u 的剩余值可以很容易地理解 bcz 几乎所有运算符都具有 lr 关联性,那么这意味着 pre 运算符具有它们总是附带的 rl 关联性是什么意思如果你在单个语句中使用超过 1 的任何运算符,那么 rl 的关联性将意味着更少的前置运算符,这也将无法找到一个可以鞋 rl 前置运算符的关联性的示例
【解决方案2】:
System.out.println(--count*count++*count++);

= 2 * 2 * 3 = 12

count = 3;
System.out.println(--count*++count*++count) 

= 2*3*4 = 24

count = 3;
System.out.println(-- count*count++);

= 2 * 2 = 4

预增/减

++/-- X 首先递增/递减然后执行操作。

后增量/减量

X ++/--首先操作完成,然后递增/递减。

【讨论】:

  • post 的优先级高于我在问题中提到的 pre 。 ——
  • post 运算符将首先评估。为什么 U 评估 pre 首先。
  • U 显示的方式可以很好地与答案匹配,请说明你在 post 运算符之前评估 pre 运算符的原因。
【解决方案3】:

我拿第一个。

System.out.println(--count*count++*count++);//out put is 12 expected 48
                    2     *    2  * 3 = 12
                    pre   * post  * post

【讨论】:

  • post 的优先级高于我在问题中提到的 pre 。
  • @dubey-theHarcourtians 没关系,因为您使用的是 * 运算符。它独立存在。
  • K 我从来没有见过你现在建议我的逻辑 - 由于* 奇怪的存在,这将不起作用!
【解决方案4】:

计数 = 3:

示例 1:

--count*count++*count++ equals (--count)*(count++)*(count++)
(--count) = 2
(count++) = 2 (you increment it AFTER you do something with it)
(count++) = 3 ... count was incremented from before
2*2*3 = 12

示例 2:

--count*++count*++count equals (--count)*(++count)*(++count)
--count = 2
++count = 3
2 * 3 * 3 = 24

示例 3:

(--count)*(count++)
--count = 2
2 * 2 (the count++ gets changed afterwards)

请记住,您必须注意乘法运算符

【讨论】:

  • post 运算符将首先评估。为什么 U 评估 pre 首先。
  • 我添加了一些括号来显示何时评估哪个。
  • 括号() 的角色在这里意义不大,因为post 运算符和() 有same precedence。这两个都有最高的优先级。
  • --count*(count++)*(count++) 很好,但您不能自己将前置运算符放在括号中。放入括号(--count) 会改变我的问题。
  • 括号不是编程的符号,而是分组的符号,以便显示何时执行。不要查看表格中的括号,使用括号查看评估顺序。这就是我写“等于”的原因(见 Nizils 的回答,他指的是评估树)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-14
  • 1970-01-01
  • 1970-01-01
  • 2017-10-22
  • 1970-01-01
  • 2014-04-17
相关资源
最近更新 更多