本文章主要突出其与C语言的区别
1.增量运算符 += -= *= %=
1.a+=1.0
a += 1.0;
a = (int)(a + 1.0);
这两个等价而不是单纯的等价于a=a+1.0
2.a=a++
public static void main(String[] args) {
int a = 10;
a = a++;
System.out.println(a);
}
在上述代码中,a的结果是什么呢?
是不是a = 11?
但其实不是的 a =10
其实这样赋值的本质是:
java中 每个方法都有一个属于自己的地方,叫做栈帧
栈帧又分为:局部变量表,操作数栈等等
局部变量表 : 主要用户存储方法参数和定义在方法体内的局部变量
操作数栈 : 主要用于保存计算过程的中间结果,同时作为计算过程中变量临时的存储空间
那么究竟是如何进行赋值的呢?过程如下:
先将 a的值 赋值一份到操作数栈中,然后在对局部变量表中的a加1,此时a = 11
然后将a = 10 的值从操作数栈中取出来赋值给a
这样就将a =11的值给覆盖了 ,导致结果就是a=10
2.关系运算符 == != < > <= >=
1.3<a<5
如果a=4,能否按照C语言那样进行 3<a<5呢?
结果是否定的
原因在于JAVA中关系运算符的结果只有true或false
而在C语言中关系运算符的结果是0或1
3.逻辑运算符 && || !
对于&& || !来说共同的特点是:
左右表达式必须是boolean类型的结果(如关系运算表达式)
运算结果都是 boolean类型。
对于 && ||来说还有两种情况:短路
对于 && , 如果 左侧表达式值为 false, 则表达式结果一定是 false, 无需计算右侧表达式 .对于 ||, 如果 左侧表达式值为 true, 则表达式结果一定是 true, 无需计算右侧表达式 .
System.out.println(10 > 20 && 10 / 0 == 0); // 打印 false
System.out.println(10 < 20 || 10 / 0 == 0); // 打印 true
上述两行代码均可正常运行
另外:& 和 | 也可以进行逻辑运算
&
和
|
如果表达式结果为
boolean
时
,
也表示逻辑运算
.
但与
&& ||
相比
,
它们
不支持短路求值
System.out.println(10 > 20 & 10 / 0 == 0); // 程序抛出异常
System.out.println(10 < 20 | 10 / 0 == 0); // 程序抛出异常
4.位运算符
关于& | ~ ^ 可以参考:
5.移位运算
移位运算符有三个
:
<< >> >>>
,都是二元运算符,且都是按照二进制比特位来运算的。
1.
左移
<<
:
最左侧位不要了
,
最右侧补
0.
int a = 0x10;
System.out.printf("%x\n", a << 1);
// 运行结果(注意, 是按十六进制打印的)
20
注意:向左移位时,丢弃的是符号位,因此正数左移可能会编程负数
2. 右移 >>: 最右侧位不要了, 最左侧补符号位(正数补0, 负数补1)
int a = 0x10;
System.out.printf("%x\n", a >> 1);
// 运行结果(注意, 是按十六进制打印的)
8
3. 无符号右移 >>>: 最右侧位不要了, 最左侧补 0.
int a = 0xffffffff;
System.out.printf("%x\n", a >>> 1);
// 运行结果(注意, 是按十六进制打印的)
7fffffff
注意
:
1. 左移 1 位 , 相当于原数字 * 2. 左移 N 位 , 相当于原数字 * 2 的N次方.2. 右移 1 位 , 相当于原数字 / 2. 右移 N 位 , 相当于原数字 / 2 的N次方.3. 由于计算机计算移位效率高于计算乘除 , 当某个代码正好乘除 2 的 N 次方的时候可以用移位运算代替 .4. 移动负数位或者移位位数过大都没有意义 .
6. 条件运算符
条件运算符只有一个
:
表达式1 ? 表达式2 : 表达式3
当
表达式
1
的值为
true
时
,
整个表达式的值为
表达式
2
的值
;
当
表达式
1
的值为
false
时
,
整个表达式的值为
表达式
3
的值
.
注意:
1. 表达式 2 和表达式 3 的结果要是同类型的,除非能发生类型隐式类型转换
int a = 10;
int b = 20;
int c = a > b? 1 : 2.0;
2. 表达式不能单独存在,其产生的结果必须要被使用。
int a = 10;
int b = 20;
a > b? a : b; // 报错:Error:(15, 14) java: 不是语句