关于java中运算符的问题?

关于java中运算符的问题?,java,operators,Java,Operators,我有一节课: public class Prog3 { public static void main(String[] arg){ int k = 0, i = 0; boolean r , t = true; r = (t & 0 < (i +=1)); r = (t && 0 < (i +=2)); r = (t | 0 < (k +=1)); r = (t || 0 < (k +=2));

我有一节课:

public class Prog3 {
public static void main(String[] arg){
    int k = 0, i = 0;
    boolean r , t = true;
    r = (t & 0 < (i +=1));
    r = (t && 0 < (i +=2));
    r = (t | 0 < (k +=1));
    r = (t || 0 < (k +=2));
    System.out.println( i+ "  " + k);
   }

}
公共类程序3{
公共静态void main(字符串[]arg){
int k=0,i=0;
布尔r,t=true;
r=(t&0<(i+=1));
r=(t&&0<(i+=2));
r=(t | 0<(k+=1));
r=(t | | 0<(k+=2));
System.out.println(i+“”+k);
}
}

为什么程序的结果是:3 1

&&
|
是短路操作员,这意味着:

  • &&
    中,如果左侧为
    false
    ,则不计算右侧
  • | |
    中,如果左侧为
    ,则不计算右侧
虽然
&
|
是位运算符,但这意味着始终对两侧进行求值

现在,让我们执行每个操作:

r = (t & 0 < (i +=1));
//true & i +=1 -> i = 1
r = (t && 0 < (i +=2));
//true && i+=2 -> i = 3
r = (t | 0 < (k +=1));
//true | k +=1 -> k = 1
r = (t || 0 < (k +=2));
//true || ... no need to evaluate right side
r=(t&0<(i+=1));
//真值&i+=1->i=1
r=(t&&0<(i+=2));
//真值(&i+=2->i=3
r=(t | 0<(k+=1));
//真| k+=1->k=1
r=(t | | 0<(k+=2));
//对| |。。。无需对右侧进行评估

|管道是位运算符。因此,即使第一个条件为真,它也会尝试执行这两个条件。 而| |如果先前的任何条件变为真,则管道不会检查其余条件。 i的值变为3,因为只有当所有条件都变为真时&&才为真

r=(t0<(i+=1)

r=(t和&0<(i+=2)

r=(t|0<(k+=1)

r=(t|0<(k+=2))


将执行粗体显示的条件。

抓起铅笔和纸,用手计算出来。一旦完成了,请发布为什么您认为它应该不同于您得到的。注意:&不同于&。阅读有关“按位”和“逻辑”运算符的更多信息。感谢您的帮助。但我有一个问题似乎有点傻:操作符
@vanphuc.iv布尔操作符是从左到右求值的。