我在我的初学者 Java 编程课上有这个问题,我在我的书中找不到一个单一的 '|' 表示作为操作员。
问题是:
int j = 0;
if ((8 > 4) | (j++ == 7))
System.out.println("j = " + j);
j = 1吗?
解释为什么。
这本书解释了 OR 运算符“||” 有例子,但它没有显示这个单一的“|”。运算符的含义是否在两者之间改变?
是的,意思变了,||
是逻辑or
运算符,|
而是按位or
。
由于此运算符在位级别操作 (...),因此它不会像 , 那样短路||
,这意味着即使第一个操作数是true
,也会计算第二个操作数。
如果您使用||
and&&
形式,而不是这些运算符的|
and&
形式,Java 将不会费心单独计算右侧操作数。
Boolean b = true;
if(b || foo.test())
{
//we entered without calling test()
}
if(b | foo.test())
{
//we entered calling test()
}
|
-> 这是按位 OR 运算符执行按位包含 OR 运算并执行两个操作数(右和左)。
按位或“|” 如果操作数中的一个或两个位为 1,则运算符产生 1。但是,如果两个位都为 0,则此运算符产生 0。更准确地说,或“|” 运算符在所有情况下都返回 1,除非两个操作数的位都为 0。
if ((8 > 4) | (j++ == 7)) System.out.println("j = " + j);
这里8>4
将返回true
并将j++ == 7
返回false
。所以它将是if(true|false)
,这里按位运算符将返回true
或 1 并打印 j 的值,该值在 j++ 之后变为 1。
运算符是按位或,|
但您可能会问为什么有人会对布尔变量使用按位或?
逻辑或运算符 ( ||
) 有一个称为短路的特性,这意味着如果左操作数的计算结果为true
,则不会进行进一步的处理,甚至右手操作数也不会计算。但是按位 OR 运算符|
总是对两个操作数求值,如果应用于布尔操作数,则对它们都求值,然后对结果应用简单的或。
在您的情况下(j++ == 7)
,无论8 > 4
. 操作员不会发生这种情况||
。所以j
会加一,程序的输出是1
.
答案是否定的,因为 j 被初始化为 0,但此后从未赋值。因此 j 的值始终保持为 0。