运算符注意的问题

容易忽略情况

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值