運算符注意的問題

容易忽略情況

運算符無論哪種語言都是不可或缺的一部分。
我們知道運算符包括+ 、-、*、/ 、%等等,運算順序遵循優先級策略原則。那麼我們在使用時,需要注意什麼呢?
首先,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位值,並不是想的會報錯。

發佈了57 篇原創文章 · 獲贊 19 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章