考虑此代码段
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但我找不到答案。 任何人都可以解释这种行为吗?
答案 0 :(得分:6)
不要忘记'++'后增量运算符在增量发生之前返回j 的值。也就是说,如果'j'是7,那么'j ++'将j设置为8,但是返回7 。然后~7就是你看到的输出,数字以三位0结尾。
'++'后增量运算符只能在所谓的“L值”上运算。 L值是实际存在于代码可以逻辑引用的某个值 - 变量,数组元素,参数或类字段。只要取出L值的值并对其应用某些数值运算,就会得到一个R值。 R值只是值,并且它们不引用可以放置结果的任何持久存储。您可以分配L值而不是R值 - 因此,如果您尝试'+'R值,则会出现编译错误。
如果'〜'运算符先行,那么你就像在(~j)++中那样使用一个R值。这不会编译。代码编译的事实意味着优先级是另一种方式:〜(j ++)。
像这样的括号是我所知道的最简单的方法,你可以在出现任何混淆时排除优先级:只写三个测试用例:
运行它并查看#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