按位运算不与Java中print()中的字符串连接

Joh*_*son 17 java printing bitwise-operators operator-precedence

这段代码

int a = 6;
System.out.print("The result is " + a*a);
Run Code Online (Sandbox Code Playgroud)

工作得很好,但这一个

int a = 6;
System.out.print("The result is " + a^a);
Run Code Online (Sandbox Code Playgroud)

产生例外:

线程"main"中的异常java.lang.RuntimeException:无法编译的源代码 - 错误的树类型:at pkg1.pkg4.taking.input.TakingInput.main(TakingInput.java:11)

为什么这样?

当我试图一次性打印几个按位操作的结果时出现了这个问题,如下所示:

System.out.print(a&b + "\n" + a|b + "\n" + a^b);
Run Code Online (Sandbox Code Playgroud)

我查看了print()方法的描述和关于按位运算符的几个主题以及在SO上打印到控制台,包括编写问题时的推荐主题,但找不到答案.

GBl*_*ett 22

这是因为它+具有比它编译的优先级更高的优先级^:

("The result is " + a) ^ a
Run Code Online (Sandbox Code Playgroud)

这显然是行不通的.括号括起来:

System.out.print("The result is " + (a^a));
Run Code Online (Sandbox Code Playgroud)

或者正如Holger所提到的,您可以使用printf以下方法消除此问题:

System.out.printf("The result is %d", a^a);
Run Code Online (Sandbox Code Playgroud)

  • @Jai OP肯定使用IDE没有,他甚至不会尝试运行一个没有编译的程序.除此之外,原来的Java设计师应该受到指责.使用`+`进行字符串连接是一个很大的错误.它不仅具有不幸的优先权,当至少有一个"+"的操作数是一个字符串时,通常对加法的交换性的期望也不成立.但即便是Java本身也有另一种选择,`System.out.printf("结果是%d",a ^ a);`... (4认同)