2

我试图评估以下内容:

  1. System.out.println(""+(3!=3 | 2==2 | 3==1));- 返回 TRUE
  2. System.out.println(""+(3!=3 & 2==2 & 3==1));- 返回错误
  3. System.out.println(""+(3!=3 ^ 2==2 ^ 3==1));- 返回 TRUE - 如何以及为什么?

我的理解:

  1. 将返回 TRUE;基于第二次比较 ( 2==2);但它会做所有的比较;不像||只做 1 次比较并返回结果

  2. 将返回假;即使它在第一次比较(3!=3)期间得到结果;但它会做所有的比较。不像&&只做1个比较并返回结果

  3. ? 它如何评估陈述?
4

4 回答 4

4
System.out.println(""+(3!=3 | 2==2 | 3==1));
// System.out.println(""+(false | true | false));
// System.out.println(""+(    true     | false));
// System.out.println(""+(true));
System.out.println(""+(3!=3 & 2==2 & 3==1));
// System.out.println(""+(false & true & false));
// System.out.println(""+(    false    & false));
// System.out.println(""+(false));
System.out.println(""+(3!=3 ^ 2==2 ^ 3==1));
// System.out.println(""+(false ^ true ^ false));
// System.out.println(""+(    true     ^ false));
// System.out.println(""+(true));

引用JLS 第 15.22.2 节,并知道表达式是从左到右计算的:

对于&,结果值是true如果两个操作数值都是true; 否则,结果为false

对于^,结果值是true如果操作数值不同;否则,结果为false

对于|,结果值是false如果两个操作数值都是false; 否则,结果为true

作为旁注,正确的名称

  • &是按位和。
  • |是按位包含或。
  • ^是按位异或。
于 2015-12-03T10:06:02.233 回答
1

它从左到右进行评估:

3!=3 ^ 2==2这是false ^ true真的。

true ^ 3==1这是true ^ false真的。

于 2015-12-03T10:04:44.803 回答
0

当数字以二进制形式写入时,它是 java 中的按位异或运算符,对于不同的位值(即 1 ^ 0 = 1)和相同的位值(即 0 ^ 0 = 0)结果为 0。

首先它评估 (3!=3 ^ 2==2) 为假,然后假(来自上一步)^假(3==1)被评估为真。

于 2015-12-03T10:10:53.700 回答
0

XOR 是“排他性或声明”。一般如何工作:取这两个二进制数:

0 0 1 1 0 1
0 1 1 0 1 1
- - - - - - XOR
0 1 0 1 1 0

仅当比较的两个布尔值之一为真时, XOR才会返回真。

所以在布尔比较的情况下(逻辑表):

   ^  |  true | false
----------------------
true  | false | true
----------------------
false | true  | false

在您的具体情况下,这意味着:

( 3!=3  ^ 2==2   ^ 3==1)
((false ^ true)  ^ 3==1)
(       true     ^ 3==1)
(       true     ^ false)
true
于 2015-12-03T10:07:02.363 回答