Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java运算符优先级_Java_Operator Precedence - Fatal编程技术网

Java运算符优先级

Java运算符优先级,java,operator-precedence,Java,Operator Precedence,我一直在玩java代码,直到我碰到了这堵硬墙: int m = 5; System.out.println(m++); System.out.println(++m); System.out.println(m = ++m * 2); System.out.println(m = m++ * 2); System.out.println(m); 输出结果(我真的无法解释)如

我一直在玩java代码,直到我碰到了这堵硬墙:

int m = 5;
            System.out.println(m++);
            System.out.println(++m);
            System.out.println(m = ++m * 2);
            System.out.println(m = m++ * 2);

            System.out.println(m);
输出结果(我真的无法解释)如下:

5
7
16
32
32

这真让我抓狂!为什么编译器会跳过乘法之前的最后一个m++代码?是编译器将1添加到m的另一个实例中而不是原始实例中。。。我真的怀疑这是否有任何意义

Java最后执行
=
,如果执行

m = m++;
你实际上在做什么

int tmp = m;
m++;
m = tmp;
这是一个很好的迷惑自己的方法,所以不要这样做


然而,如果您喜欢混淆自己,您可以全力以赴编写这样的代码

for (char c‮h = 0; c‮h < Character.MAX_VALUE; c‮h++)
    if (Character.isJavaIdentifierPart(c‮h) && !Character.isJavaIdentifierStart(c‮h))
        System.out.printf("%04x <%s>%n", (int) c‮h, "" + c‮h);
用于(字符c‮h=0;c‮h

它看起来甚至不像是编译的,但它确实编译了。它将打印您可以在Java标识符中使用的所有非ascii字符。

切勿在分配给
m
的表达式中使用
m++
,这样您就不会遇到问题。除此之外,您只需阅读Java表达式求值的语义,可从Oracle(Java语言规范)公开获得。m++是增量后,增量后,但在使用之前,你用一个使用旧值的计算结果来覆盖它,这是C++中的一个未定义的行为。我想这意味着你不应该在任何地方做这件事。@JanDvorak你确定吗?在我看来,它定义得很好(尽管我同意它永远不应该被使用)@Dave从后期增量回写到
m
,与从显式赋值回写到
m
是不顺序的。所以,乌布,我不敢相信我的眼睛,当我将其粘贴到编辑器中时,它会发生变化……这是怎么发生的?@pinkparter诀窍在于Unicode特殊字符,它使文本从右向左流动。@pinkparter简而言之,有一个字符
\u202e
,您可以在标识符中使用它,从而使行的其余部分向后打印(并且是零宽度作为奖励)@MarkoTopolnik所有的括号都被翻转以使它更可读(如果你是从右到左阅读的话)所有这些都是对Eclipse的欢呼,我设法用应用于
ch
的“在文件中重命名”来解读它: