一、自增自减
1.后增:
先备份, 后自加 ,x 最终结果为 1。
int x = 1;
x = x ++;
System.out.println("x = 1,执行 x = x++ 后的结果为:"+ x); //结果为 1
2.先增:
先自加 ,后备份,y 最终结果为 2。
int y = 1;
y = ++ y;
System.out.println("y = 1,执行 y = ++y 后的结果为:"+ y); //结果为 2
3.多个变量 ,自增、自减 的 混合运算:
int m = 1;
int n = 2;
int sum = m++ + ++n - n-- - --m + n-- - --m;
System.out.println("m=1,n=2,执行 sum = m++ + ++n - n-- - --m + n-- - --m 后:");
System.out.println("m = "+ m); //m=0
System.out.println("n = "+ n); //n=1
System.out.println("sun = "+ sum);//sum=2
4. “a += 2” 和 “a = a + 2” 的区别 :
会报错 ,如图:
正确写法 ,如下:
二、逻辑运算
‘&&’ 和 ‘&’ , 以及 ‘||’ 和 ‘|’
相同点: 单符号逻辑运算符 和 双符号逻辑运算符 的运算结果相同。
不同点: 双符号运算时,若第一个表达式的结果可以确定最终结果,就直接返回结果。
例:
System.out.println("(3>2) && (3>4)的结果为:"+ ( (3>2) && (3>4) ) ); //结果为:false
System.out.println("(3>2) & (3>4)的结果为:"+ ( (3>2) & (3>4) ) ); //结果为:false
System.out.println("(3>2) || (3>4)的结果为:"+ ( (3>2) || (3>4) ) ); //结果为:true
System.out.println("(3>2) | (3>4)的结果为:"+ ( (3>2) | (3>4) ) ); //结果为:true
三、位运算
位运算 的 运算方式:
将 操作数 变为 二进制数 补码, 然后 逐位运算,
最后将 二进制结果 转换为 十进制真值 返回。
例:
System.out.println("- 3 & 7 的结果为: "+ ( -3 & 7 ) ); //结果为:+5
System.out.println("- 3 | 7 的结果为: "+ ( -3 | 7 ) ); //结果为:-1
System.out.println("- 3 ^ 7 的结果为: "+ ( -3 ^ 7 ) ); //结果为:-6
System.out.println("- 3 按位非运算 的结果为:"+ (~ -3)); //结果为:+2
解释说明:
-3 的 二进制数为:1 011,补码 为:1 101;
7 的 二进制数 为:0 111,补码 为:0 111。
二者补码分别为: 1 101 和 0 111
按位 与 运算,结果为:0 101(补码)
按位 或 运算,结果为:1 111 (补码)
按位 与运算 和 按位 或运算 的真值分别为:
与运算 结果:0 101(补码)——> 0 101(原码)——> +5(真值)
或运算 结果:1 111(补码)——> 1 001(原码)——> - 1(真值)
二者 异或:
结果 为 : 1 010(补码)——> 1 110(原码)——> - 6(真值)
-3 的 非运算:
-3 的 二进制数为: 1 011,
补码 为:1 101,按位取非后 为: 0 010 。
故:0 010(补码)——> 0 010(原码)——> +2(真值)
四、移位运算
运算方式:
无论正负,计算机均存储该数据的 补码形式。
- 1>.左移 运算符 << :最后面 补0, 返回结果 等于原数 乘以 2。
- 2>.右移 运算符 >> :最前面 补符号位,返回结果 等于原数 除以 2。
- 3>.无符号右移 >>> :最前面 均 补0。
例:
System.out.println("-8 << 1 = "+ ( -8 << 1) ); //结果为:-16
System.out.println("-8 >> 1 = "+ ( -8 >> 1) ); //结果为:-4
System.out.println("-8 >>> 1 = "+ ( -8 >>> 1)); //结果为:+2147483644
五、程序源码
public static void main(String[] args) {
/**
* 1. 自增运算
*/
int x = 1;
x = x ++; //先备份,后自加,x最终结果为1。
System.out.println("x = 1,执行 x = x++ 后的结果为:"+ x);
int y = 1;
y = ++ y; //先自加,后备份,y最终结果为2。
System.out.println("y = 1,执行 y = ++y 后的结果为:"+ y);
/**
* 2. 多个变量 自增、自减 的 混合运算
*/
int m = 1;
int n = 2;
int sum = m++ + ++n - n-- - --m + n-- - --m;
System.out.println("\nm=1,n=2,执行 sum = m++ + ++n - n-- - --m + n-- - --m 后:");
System.out.println("m = "+ m); //m=0
System.out.println("n = "+ n); //n=1
System.out.println("sun = "+ sum);//sum=2
/**
* 3. “a += 2” 和 “a = a + 2” 的区别
*/
byte a = 1;
a += 2;
a = (byte) (a + 2);//不强制转换,会被报错
System.out.println(a);
/**
* 4. 逻辑运算。
* '&&' 和 '&' , 以及 '||' 和 '|'
* 相同点: 单符号逻辑运算符 和 双符号逻辑运算符 的运算结果相同。
* 不同点: 双符号运算时,若第一个表达式的结果可以确定最终结果,就直接返回结果。
*/
System.out.println("(3>2) && (3>4)的结果为:"+ ( (3>2) && (3>4) ) );
System.out.println("(3>2) & (3>4)的结果为:"+ ( (3>2) & (3>4) ) );
System.out.println("(3>2) || (3>4)的结果为:"+ ( (3>2) || (3>4) ) );
System.out.println("(3>2) | (3>4)的结果为:"+ ( (3>2) | (3>4) ) + "\n");
/**
* 5.位运算:
* 是将操作数变为 二进制数 补码, 然后 逐位运算,
* 最后将 二进制结果 转换为 十进制真值 返回。
*/
/**
* 解释说明:
* -3 的 二进制数 为:1 011,补码 为:1 101;
* 7 的 二进制数 为:0 111,补码 为:0 111。
* 二者补码分别为: 1 101 和 0 111
*
* 按位 与 运算,结果为:0 101(补码)
* 按位 或 运算,结果为:1 111 (补码)
* 按位 与运算 和 按位 或运算 的真值分别为:
* 与运算 结果:0 101(补码)——> 0 101(原码)——> +5(真值)
* 或运算 结果:1 111(补码)——> 1 001(原码)——> - 1(真值)
*
* 二者 异或:
* 结果 为 : 1 010(补码)——> 1 110(原码)——> - 6(真值)
*
* -3 的 非运算:
* -3 的 二进制数为: 1 011,
* 补码 为:1 101,按位取非后 为: 0 010 。
* 故:0 010(补码)——> 0 010(原码)——> +2(真值)
*/
System.out.println("- 3 & 7 的结果为: "+ ( -3 & 7 ) );//结果为:+5
System.out.println("- 3 | 7 的结果为: "+ ( -3 | 7 ) );//结果为:-1
System.out.println("- 3 ^ 7 的结果为: "+ ( -3 ^ 7 ) );//结果为:-6
System.out.println("- 3 按位非运算 的结果为:"+ (~ -3) + "\n");//结果为:+2
/**
* 6. 移位运算:
* 无论正负,计算机均存储该数据的 补码形式。
* 1>.左移 运算符 << : 最后面 补0, 返回结果 等于原数 乘以 2。
* 2>.右移 运算符 >> : 最前面 补符号位,返回结果 等于原数 除以 2。
* 3>.无符号右移 >>> : 最前面 均 补0。
*/
System.out.println("-8 << 1 = "+ ( -8 << 1) );//结果为:-16
System.out.println("-8 >> 1 = "+ ( -8 >> 1) );//结果为:-4
System.out.println("-8 >>> 1 = "+ ( -8 >>> 1));//结果为:+2147483644
}