java中〜和++的优先级

时间:2013-05-10 15:03:15

标签: java operators bitwise-operators logical-operators

考虑此代码段

int j = 7;
System.out.println(Integer.toBinaryString(j));
j = ~j++;
System.out.println(Integer.toBinaryString(j));

打印

111
11111111111111111111111111111000

我期待看到什么

111
11111111111111111111111111111001

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

的优先级

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

11111111111111111111111111111001

否则,如果在〜

之前评估++
11111111111111111111111111110111

我搜索Oracle tutorials但我找不到答案。 任何人都可以解释这种行为吗?

5 个答案:

答案 0 :(得分:6)

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

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

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

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

  1. 你不确定的原始方式。
  2. 用括号强制执行一个操作顺序。
  3. 用括号强制执行其他操作顺序。
  4. 运行它并查看#2或#3是否与#1产生相同的结果。 : - )

答案 1 :(得分:1)

代码似乎非常脆弱。我认为正在发生的事情是,当评估表达式“~i ++”时,提取值“~i”,执行“i ++”,最后执行赋值(覆盖“i ++”中的前一个值)。

答案 2 :(得分:1)

两个运算符都是右关联的二次运算符,但是一个简单的测试表明它是++首先执行而BITWISE NOT运算后者。

int j = 7, z = 7, k = 7;
z = z++;
z = ~z;
k = ~k++;
j = ~j;
j++;
System.out.println(Integer.toBinaryString(z));
// 11111111111111111111111111111000
System.out.println(Integer.toBinaryString(j));
// 11111111111111111111111111111001
System.out.println(Integer.toBinaryString(k));
// 11111111111111111111111111111000

答案 3 :(得分:1)

从右到左评估一元运算符(++1--+-~!)。因此,在++之前评估~

答案 4 :(得分:0)

首先,不要这样做。没有理由将这样的运算符组合成一个语句,但我意识到你并没有真正计划将它放到实时代码中并且只是在试验。尝试使用此页面获取Java运算符优先级:http://bmanolov.free.fr/javaoperators.php