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