如果运算符写在后面表示先使用变量之后再进行自增或自减的操作,如果写在前面则先进行自增或自减的操作。程序如下:
public class OperateDemo06{
public static void main(String args[]){
int a = 3 , b = 3 ; // 定义两个变量a和b
int x = 6, y = 6 ; // 定义两个变量x和y
System.out.println("a = " + a) ;
System.out.println("\t a++ = " + (a++) + " , a = " + a) ; // 先计算后自增
System.out.println("b = " + b) ;
System.out.println("\t ++b = " + (++b) + " , b = " + b) ; // 先自增后计算
System.out.println("x = " + x) ;
System.out.println("\t x-- = " + (x--) + " , x = " + x) ; // 先计算后自减
System.out.println("y = " + y) ;
System.out.println("\t --y = " + (--y) + " , y = " + y) ; // 先自减后计算
}
};
不管是短路还是还是非短路,其基本的操作结果是一样的。
使用与操作的时候,要求前几个表达式的内容都要是true最终结果才是true,如果有一个是false,则最终结果就是false。&& 表示短路与,对于与&来说,要求所有的条件都判断,而如果使用短路与&& 如果第一个条件是false,则后面的条件都不再判断。
使用或操作的时候,要求前后几个表达式只要有一个true则最终结果就是true,如果全部是false,最终结果才是false。|| 表示短路或,对于或| 来说,要求所有的条件都判断,而如果使用短路或|| 只要第一个条件为false,则后面的条件都不再判断。代码如下:
public class OperateDemo09{
public static void main(String args[]){
int x = 10 / 0 ; // 定义变量
System.out.println("x = " + x) ;
}
};
程序会报错。
public class OperateDemo10{
public static void main(String args[]){
if(10!=10&10/0==0){
System.out.println("条件不满足") ;
}
}
};
也会报错是因为会检查所有的判断。
public class OperateDemo11{
public static void main(String args[]){
if((10!=10)&&(10/0==0)){
System.out.println("条件满足") ;
}
}
};
不会报错是因为第一个条件不满足,后面的条件不会再判断,因此不会报错。
或| 和 短路或 ||
public class OperateDemo12{
public static void main(String args[]){
if(10==10|10/0==0){
System.out.println("条件满足") ;
}
}
};
会报错,是因为会检查所有的判断。
public class OperateDemo13{
public static void main(String args[]){
if(10==10||10/0==0){
System.out.println("条件满足") ;
}
}
};
则不会报错,因为第一个条件为true,后面的则不再进行判断。
经分析后发现,短路与和短路或才是最常用的。
对于异或操作,相同为0,不同为1.
代码如下:
public class OperateDemo15{
public static void main(String args[]){
int x = 3 ; // 3的二进制数据: 00000000 00000000 00000000 00000011
int y = 6 ; // 6的二进制数据: 00000000 00000000 00000000 00000110
System.out.println(x & y) ; //与: 00000000 00000000 00000000 00000010
System.out.println(x | y) ; //或: 00000000 00000000 00000000 00000111
System.out.println(x ^ y) ; //或: 00000000 00000000 00000000 00000101
}
};
还可以通过~ 取反码 代码如下:
public class OperateDemo16{
public static void main(String args[]){
int x = -3 ; // 应该以补码的形式存在,补码 = 反码 + 1
System.out.println(~x) ;
}
};
负数的原码 = 二进制数(符号位为1)
负数的反码 = 符号位不变 其余位取反;
负数的补码 = 负数的反码 + 1;
负数取反操作 = 负数原码补码 +1;具体如下:
在Java中还提供了左移和右移操作:
左移操作<<是将运算数的二进制码整体左移指定数位,左移之后的空位使用0补充。
右移操作>> 是将运算数的二进制码整体右移,右移之后空出来的位置使用符号位填充。如果是正整数使用 0 填充,如果是负数使用1填充。
具体代码如下:
public class OperateDemo18{
public static void main(String args[]){
int x = 3 ; // 3的二进制数据: 00000000 00000000 00000000 00000011
int y = -3 ; // -3的二进制数据: 11111111 11111111 11111111 11111101
System.out.println(x + "右移2位之后的内容:" + (x>>2)) ;
System.out.println(y + "右移2位之后的内容:" + (y>>2)) ;
}
};
具体操作是:若是负数则先转为补码再移位。若是正整数则直接移位。具体操作如下:
正数的左移操作:
正负数的右移操作:
以上的右移操作属于带符号位的右移操作,在Java中也提供了无符号的右移操作符 >>> 使用此运算符将以 0 填充空出来的位。
无符号右移示例如下:
public class OperateDemo19{
public static void main(String args[]){
int x = 3 ; // 3的二进制数据: 00000000 00000000 00000000 00000011
int y = -3 ; // -3的二进制数据: 11111111 11111111 11111111 11111101
System.out.println(x + "右移2位之后的内容:" + (x>>>2)) ;
System.out.println(y + "右移2位之后的内容:" + (y>>>2)) ;
}
};
执行步骤如下:
运算符的优先级如下:
简洁表达式: