Java 对post++和--pre运算符的操作

Java 对post++和--pre运算符的操作,java,operators,operator-precedence,associativity,Java,Operators,Operator Precedence,Associativity,我想知道后期和预增量和减量操作 据我所知,Java中post运算符的优先级很高,关联性是从左到右的,而pre运算符的关联性是从右到左的 但是我的代码显示了我不想要的结果- public class Bunnies { static int count = 3; public static void main(String[] args) { System.out.println(--count*count++*count++);//out put is 1

我想知道后期和预增量和减量操作

据我所知,Java中post运算符的优先级很高,关联性是从左到右的,而pre运算符的关联性是从右到左的

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

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 
         }
}
=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++/-首先完成操作,然后递增/递减

=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++/-首先完成操作,然后递增/递减。

我取第一个

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

System.out.println(--count*count++*count++);//out put is 12 expected 48
                    2     *    2  * 3 = 12
                    pre   * post  * post
计数=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)
请记住,您必须观察乘法运算符

count=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)
请记住,您必须观察乘法运算符

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

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

并且,由于先计算pre运算符,因此,-count将在其计算之前递减。同样,由于最近对post运算符求值,count++将在求值后递增

优先级仅帮助编译器创建正确的抽象语法树。 例如,在执行++计数*2时,编译器使用优先级来知道表达式是++计数*2而不是++计数*2。同样,当执行++count*count-时,表达式是++count*count-而不是++count*count-或其他任何形式。但是,在乘法运算的过程中,count是在count-之前计算的

希望这对您有所帮助:

我刚刚找到了一个关于C和Java中表达式计算的好答案,请欣赏:

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

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

并且,由于先计算pre运算符,因此,-count将在其计算之前递减。同样,由于最近对post运算符求值,count++将在求值后递增

优先级仅帮助编译器创建正确的抽象语法树。 例如,在执行++计数*2时,编译器使用优先级来知道表达式是++计数*2而不是++计数*2。同样,当执行++count*count-时,表达式是++count*count-而不是++count*count-或其他任何形式。但是,在乘法运算的过程中,count是在count-之前计算的

希望这对您有所帮助:


我刚刚在C和Java中找到了一个关于表达式求值的好答案,请欣赏:

我正在检查这些帖子和预习是如何工作的。这不是实时应用程序的一部分。我对C语言很熟悉,对Java也很好奇。你应该相信并引用Java语言规范,而不是任何其他文档,是的,包括Java教程。当您有-Number时,该数字将首先减少,然后执行下一个操作。当你有数字+,那么操作将执行,然后数字将增加,这是C++的,不是java…@ @奥尔史希AM在Oracle文档中,我检查这些帖子和预处理。不是实时应用的一部分。我在C中有声音,这些操作员在java中购买我的疑惑。你应该信任和引用,Java语言规范优于任何其他文档,包括Java教程。当您有-Number时,该数字将首先减少,然后执行下一个操作。当你有数字++时,操作将被执行,然后数字将增加,图为C++,而不是java…@ @奥尔史希AM,在Oracle文档之后,POST的优先级高于我在我的问题Alrdy中提到的。K我从来没有见过你现在建议我的逻辑——这不会起作用,因为存在*奇怪!post的优先级比我在问题alrady中提到的pre高。@dubey theHarcourtians这没关系,因为您使用的是*运算符。K我从来没有见过你现在建议我的逻辑——这不会起作用,因为存在*奇怪!职位的优先级高于我在问题alrady中提到的职位的优先级将首先评估post运算符。w

为什么你先评估了前置运算符。你显示的方式与答案很好匹配,请说明为什么你在后置运算符之前评估前置运算符。后置运算符的优先级高于我在问题alrady中提到的前置运算符post运算符将首先进行评估。为什么您先进行评估。显示的方式与答案匹配良好,请说明为什么您先计算前置运算符,然后再计算后置运算符。后置运算符将首先计算。为什么您先计算前置运算符。我添加了一些括号以显示何时计算。括号的角色在这里的意义较小,因为后置运算符具有相同的优先级。这两个都有最高的优先级。-count*count++*count++可以,但你不能自己将pre运算符放在括号中。放在括号中count会改变我的问题。括号不是编程的符号,而是分组的符号,以显示在执行时执行的操作。不要查看表格中的括号,使用括号查看评估顺序。这就是为什么我写了equals的原因参见Nizils的答案,他指的是求值树。post运算符将首先求值。为什么U求值为pre-first。我添加了一些括号以显示何时求值。括号的作用在这里的意义较小,因为post运算符具有相同的优先级。这两个都有最高的优先级。-count*count++*count++可以,但你不能自己将pre运算符放在括号中。放在括号中count会改变我的问题。括号不是编程的符号,而是分组的符号,以显示在执行时执行的操作。不要查看表格中的括号,使用括号查看评估顺序。这就是为什么我写了“平等”的原因。见尼兹尔的答案,他指的是评估树。多重分类的作用只出现在前和后,因为它们的优先级更高,这是优先级,对查询毫无帮助。@dubey theHarcourtians你误解了什么是优先级,把它与评估混淆了。在执行++计数*2时,编译器将创建一个AST抽象语法树来计算表达式,并使用优先级来构建此树。pre或post运算符的优先级较高,因此它将在乘法之前应用,但乘法仍然从左到右求值。请参阅我的编辑:是@Nizil没有任何*计算的r-l或l-t结果将是相同的。但可用于乘法的值将根据post和pre运算符进行计算。@dubey theHarcourtians看一看:这并不意味着我们使用乘法,所以剩余值计算的l-r.u可以轻松理解bcz几乎所有的运算符都有l-r结合性,那么前置运算符有r-l结合性是什么意思呢?它们总是与任何运算符一起出现如果u-r在一个语句中使用了超过1个,那么r-l的结合性将意味着更少的前置运算符,此外,这将不可能找到一个单独的示例来说明前置运算符的r-l关联性或多重定位的角色仅位于前置运算符和后置运算符之后,因为它们的优先级更高,这是优先级,对查询毫无帮助。@dubey the Harcourtians您误解了什么是优先级,并将其与计算混淆。在执行++计数*2时,编译器将创建一个AST抽象语法树来计算表达式,并使用优先级来构建此树。pre或post运算符的优先级较高,因此它将在乘法之前应用,但乘法仍然从左到右求值。请参阅我的编辑:是@Nizil没有任何*计算的r-l或l-t结果将是相同的。但可用于乘法的值将根据post和pre运算符进行计算。@dubey theHarcourtians看一看:这并不意味着我们使用乘法,所以剩余值计算的l-r.u可以轻松理解bcz几乎所有的运算符都有l-r结合性,那么前置运算符有r-l结合性是什么意思呢?它们总是与任何运算符一起出现如果u-r在一个语句中使用了超过1个,那么r-l的结合性将意味着更少的前置运算符,同样,这也将不可能找到一个能证明pre算子r-l结合性的例子