这里的代码。
public class Test {
public static void main(String[] args) {
int x=2; int y = 3;
if((y == x++) | (x < ++y)){
System.out.println("x = " + x + "Y = " + y);
}
}
}
这会输出x=3 y=4
另一个标准
public class Test {
public static void main(String[] args) {
System.out.println(4|3);
}
}
这会输出7
这里第二个标准|
用作位智能运算符。但在第一个标准|
不是。它操纵并提供输出。我需要解释第一个标准是如何工作的。
我知道的是,|
将比较双方,而||
只会比较左侧,而真正进行到下一步。
希望我的问题很明确。谢谢你提前..
答案 0 :(得分:2)
对于第一个例子,您将拥有:
if ((3 == 2) | (3 < 4))
等于:
if ( false | true )
并评估为true
(因为比较了表达式的两边)。
对于第二个例子,既然你已经知道|
会比较双方,这就是它真正发生的事情。数字转换为二进制数,然后应用操作:
4 | 3
将转换为:
100 | 011 = 111
等于7
。
答案 1 :(得分:1)
关注JLS 15.22.2:
当
&
,^
或|
运算符的两个操作数都是boolean
或Boolean
类型时,则按位运算符表达式的类型是boolean
。在所有情况下,操作数都必须根据需要进行拆箱转换(§5.1.8)。对于
&
,如果两个操作数值均为true
,则结果值为true
;否则,结果为false
。对于
^
,如果操作数值不同,则结果值为true
;否则,结果为false
。对于
|
,如果两个操作数值均为false
,则结果值为false
;否则,结果为true
。
采取第一种情况:
int x=2; int y = 3;
if((y == x++) | (x < ++y)){
System.out.println("x = " + x + "Y = " + y);
}
(y == x++)
为false,因为x++
为后递增,(x < ++y)
为真,因此false|true
为true
,您将获得控制台o / p x=3
和y=4
的值。
第二种情况,是自然按位OR:
System.out.println(4|3);
3-bit 中的(011|100)
= (111)
= 7
(基数为10)。
答案 2 :(得分:1)
在第一个示例中,首先评估表达式的左侧:
y == x++ // y == x; x=x + 1
y
为3,x为2,等式检查为false
,x
增加为3。
然后评估表达式的右侧:
x < ++y; // y = y + 1; x < y
y
递增且为4,然后检查x
是否小于y
。是的,3小于4,右边的结果是true
。
由于左侧|
与右侧false
之间存在按位true
运算符,因此结果为
false | true = true
这就是表达式true
和syso
被执行的原因。
在第二个例子中,执行按位OR,因此
100 | 011 = 111 //is equal to 7