关于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=(t和0<(i+=1))
r=(t和&0<(i+=2))
r=(t|0<(k+=1))
r=(t|0<(k+=2))
将执行粗体显示的条件。抓起铅笔和纸,用手计算出来。一旦完成了,请发布为什么您认为它应该不同于您得到的。注意:&不同于&。阅读有关“按位”和“逻辑”运算符的更多信息。感谢您的帮助。但我有一个问题似乎有点傻:操作符
@vanphuc.iv布尔操作符是从左到右求值的。