Bootstrap

JAVA中运算符要注意的地方

本文章主要突出其与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.位运算符

关于& | ~ ^ 可以参考:

http://t.csdnimg.cn/Uzzqw

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: 不是语句

 

 

;