运算符注意的问题

来源:互联网 发布:警察查封淘宝假章 编辑:程序博客网 时间:2024/06/02 03:50

容易忽略情况

运算符无论哪种语言都是不可或缺的一部分。
我们知道运算符包括+ 、-、*、/ 、%等等,运算顺序遵循优先级策略原则。那么我们在使用时,需要注意什么呢?
首先,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位值,并不是想的会报错。

原创粉丝点击