java中〜和++的优先级

Ash*_*leh 7 java operators bitwise-operators logical-operators

考虑这段代码

int j = 7;
System.out.println(Integer.toBinaryString(j));
j = ~j++;
System.out.println(Integer.toBinaryString(j));
Run Code Online (Sandbox Code Playgroud)

版画

111
11111111111111111111111111111000
Run Code Online (Sandbox Code Playgroud)

我期待看到的

111
11111111111111111111111111111001
Run Code Online (Sandbox Code Playgroud)

首先我认为它可能是〜和++的优先级

如果在++之前评估〜,答案就是

11111111111111111111111111111001
Run Code Online (Sandbox Code Playgroud)

否则,如果在〜之前评估++

11111111111111111111111111110111
Run Code Online (Sandbox Code Playgroud)

我搜索了Oracle教程,但我找不到答案.谁能解释这种行为?

Jon*_*ert 6

不要忘记'++'后增量运算符在增量发生之前返回j的值.也就是说,如果'j'是7,那么'j ++'将j设置为8,但返回7.然后~7是你看到的输出,数字以三个0位结尾.

'++'后增量运算符只能在所谓的"L值"上运算.L值是实际存在于代码可以逻辑引用的某个值 - 变量,数组元素,参数或类字段.只要取出L值的值并对其应用某些数值运算,就会得到一个R值.R值只是值,它们不是指可以放置结果的任何持久存储.您可以分配L值但不分配R值 - 因此,如果您尝试'+'R值,则会出现编译错误.

如果'〜'运算符先行,那么你就像在(~j)++中那样使用一个R值.这不会编译.代码编译的事实意味着优先级是另一种方式:〜(j ++).

像这样的括号是我所知道的最简单的方法,你可以在出现任何混淆时排除优先级:只写三个测试用例:

  1. 你不确定的原始方式.
  2. 用括号强制一个操作顺序.
  3. 用括号强制执行其他操作顺序.

运行它,看看#2或#3是否产生与#1相同的结果.:-)