2

这里是代码。

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

在这里,第二个标准|用作按位运算符。但在第一个标准|不是。它操纵并给出输出。我需要解释第一个标准是如何工作的。

我所知道的是,| 将比较双方并且||只会比较左侧,并且确实会继续进行下一步。

希望我的问题很清楚。先感谢您..

4

3 回答 3

2

对于第一个示例,您将拥有:

if ((3 == 2) | (3 < 4))

这等于:

if ( false | true )

并计算为true(因为比较了表达式的两边)。

对于第二个示例,由于您已经知道这|将比较双方,这就是实际发生的情况。将数字转换为二进制数字,然后应用操作:

4 | 3

将转换为:

100 | 011 = 111

等于7

于 2013-06-18T08:12:21.237 回答
1

遵循JLS 15.22.2

当 a &, ^, or|运算符的两个操作数都是booleanorBoolean类型时,按位运算符表达式的类型是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++is post-increment ,(x < ++y)是 true ,因此false|trueis并且你得到带有andtrue值的控制台 o/p 。x=3y=4


第二种情况,自然按位或:

System.out.println(4|3);

3 位是= (011|100)= (111)( 7base 10)。

于 2013-06-18T08:12:32.143 回答
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

由于左侧和右侧|之间存在按位运算符,因此结果是falsetrue

false | true = true

这就是表达式 istrue并被syso执行的原因。


在第二个示例中,执行按位或,因此

100 | 011 = 111 //is equal to 7
于 2013-06-18T08:18:03.127 回答