容易忽略情况
运算符无论哪种语言都是不可或缺的一部分。
我们知道运算符包括+ 、-、*、/ 、%等等,运算顺序遵循优先级策略原则。那么我们在使用时,需要注意什么呢?
首先,String 是有+=这个用法的,尽管它是String。
其次,整数除法会直接砍掉小数,而不是进位。
最后,%运算是针对正整数,虽然小数也能有结果。
书写注意事项
书写尽量简单清晰明了。
比如,
int a = 5;
int b = a*-a;
这种写法就不好,尽管机器能识别,但是不利于我们辨识,可以
int a = 5;
int b = a*(-a);
或者
int a = 5;
int b = -a*a;
自增自减
我们都知道变量增加1或者减少1,我们通常会这么写:
int aa = 1;
int bb = aa+1;
或者
cc = 3;
int dd = cc-1;
我们可以简写为:
int aa = 1;
int bb = ++aa;
或者
int cc = 3;
int dd = --cc;
这++ 或– 就是自增自减,那么自增自减的表示是什么?
自增:
int i = 0;
i++;//表示先计算表达式值,然后i增加1
++i;//表示i先自增1,然后计算表达式值
以例为证:
int x = 0;
int y1 = x++;//++在变量之后,先引用后增加
结果:y1= 0;
但是
int y2 = ++x;//++在变量前,先增加后使用
结果:y2 = 1;
==运算
下面来看一个例子,这个结果是多少呢?
public void ss(){
Integer i = new Integer(22);
Integer b = new Integer(22);
System.out.println(i == b);
System.out.println(i != b);
}
结果:
false
true
刚开始乍一看,觉得第一个是true,第二个是false,但是呢?
此时== 、!=比较的是对象的句柄而不是内容,所以我们看到的22是相同内容。那么怎么比较内容呢?对象而言,用equals.
public void ss(){
Integer i = new Integer(22);
Integer b = new Integer(22);
System.out.println(i.equals(b));
}
结果:true
对基本数据类型而言,比较的就是值。
public void ss(){
int i = 22;
int b = 22;
/*
* 或者
* int i = new Integer(22);
* int b = new Integer(22);
*/
System.out.println(i == b);
}
结果:
true
移位运算
比如,如下情况:
int x = Integer.MAX_VALUE<<1;
那么,x值是多少呢?
出现了一种情况就是超越了int的最大值范围
我们都知道 Integer.MAX_VALUE在计算机中的表示
01111111 11111111 11111111 11111111
共32位,最高位是符号位
左移1位就是
11111111 11111111 11111111 11111110
最高位变为1
这是它的补码形式,负数是以补码形式存在,所以求其源码
已知补码求原码 :补码减去1,取反,符号位不变
所以补码
10000000 00000000 00000000 00000010
结果就是-2
所以2*Integer.MAX_VALUE的值为-2,取低32位值,并不是想的会报错。