Can';我不理解以下Java表达式的输出。它应该只是运算符优先级和关联性的练习

Can';我不理解以下Java表达式的输出。它应该只是运算符优先级和关联性的练习,java,operators,Java,Operators,下面是一个表达: class ExpresieUrata { public static void main(String[] args) { int x = 101; int y = ( x+= (x *= 3) % ((x++ >> 2 ) - 1) ) ^ 40; System.out.println(y); } } 我得到了输出68,但不知道为什么。我得出的结论是,在XOR运算之前,我将得到108,由1

下面是一个表达:

class ExpresieUrata
{
    public static void main(String[] args)
    {
        int x = 101;
        int y = ( x+= (x *= 3) % ((x++ >> 2 ) - 1) ) ^ 40;
        System.out.println(y);
    }
}
我得到了输出68,但不知道为什么。我得出的结论是,在XOR运算之前,我将得到108,由101+7组成,但不知道为什么——特别是7

有人能告诉我确切的操作顺序和x在存储/在所有步骤中使用的值吗

public class Foo {
    public static void main(String[] args)
    {
        int x = 101;
        int y = ( x+= (x *= 3) % ((x++ >> 2 ) - 1) );
        //int y = ( x+= (x *= 3) % ((x++ >> 2 ) - 1) ) ^ 40;
        int z = y ^ 40;
        System.out.printf("X: %d Y: %d Z: %d\n", x, y, z);
        System.out.printf("303 >> 2 == %d\n", 303 >> 2);
        System.out.printf("303 %% 74 == %d\n", (303 % 74));
    }
}
印刷品:

X: 108 Y: 108 Z: 68
303 >> 2 == 75
303 % 74 == 7
x*=3表示303。303>>2等于75。现在减1等于74。303%74是7。x+=位在所有副作用之前使用x的原始值,因此101+7==108


天哪,这真是太邪恶了,如果我看到这样的代码,我会说些不友好的话。

好吧,我很笨,休息了5分钟让我的眼睛清醒过来后,我明白了,对不起:)我设法用类似的方式把它破解了。这是我在2005年左右在思科学院学习java基础课程的第一节java课程之后的一次练习。副作用是犯罪,x++被丢弃,因为x=101+7将覆盖303到304的更改。我非常害怕副作用,所以我在while(a[I++]!=b[j++])时不使用,而且我是一名C/C++程序员。正确使用前/后递增/递减运算符是非常安全的。但我甚至不知道写这个练习的人是什么样的心态。一个更好的练习是,“告诉我一些你不应该这样写代码的原因”;这是你学习的第一件事,运算符和优先级。