++i 和 i++ 的理解

1.C語言爲什麼要使用++運算符呢? 

   C語言從Ken Thompson早期的B語言中繼承了++和--。Thompson創造這類運算符是因爲他的B語言編譯器可以對++i產生比i = i + 1更簡潔的翻譯。這些運算符已經成爲C語言根生蒂固的一部分,但是對於今天的編譯器來說,使用++和--運算符不會使編譯後的程序變得更短小或更快,繼續使用這些運算符是因爲他們非常簡潔和便利。

2.運算符優先級表格:


3.++i 和 i++ 具體實現方法:

1> ++i是先增加後引用,先讓i + 1,後在i所在的表達式中使用i的新值。

    number = ++i;  等價於:  i = i + 1; number = i;

2> i++是先使用後增加,先讓i所在的表達式使用i的值,後讓i + 1。

    number = i++;  等價於:temp = i; number = temp; i = temp +1;

4.++i 和 i++ 的使用實例分析。

最後輸出的a和b的值分析。


#include <stdio.h>

int main(int argc, const char * argv[]) {

    int  a,b;

    for (a = 0, b = 0; a < 5; a++) {

        b += a++;

    }

    printf("a = %d\nb = %d\n",a,b);

    return 0;

}

  1> 首先先來明確一個觀點:a++是先使用再加1,而++a是先加1後再操作。因此,順序的讀程序,開始進入for循環。
  2> 第一次進入時a的初始值是0,b的初始值也是0。這時的a++並沒有在本次語句中起到加1的作用,而是要在本次操作結束後再起作用,也就是在第一次循環完全結束後。進入循環體看,b += a++;這時由於這裏的是a++(需要先操作後加1),所以,b的值理所當然是0了,而在本句結束後a的值就進行了加1操作,在本次循環結束時又進行了一次加1操作,所以本次循環結束後a=2,b=0。
  3> 第二次進入時a的初始值是2,b的初始值是0。同理分析,在b += a++;後b的值爲2了,而a的值也由於兩次a++變爲了4。所以,本次循環結束後a=4,b=2。
  4> 第三次進入時a的初始值是4,b的初始值是2。同理分析,在b += a++;後b的值由於經過原來的值與i當前的值相加後變成了6,而a的值同樣是在最後加了兩個1。所以在本次循環結束後a=6,b=6。
  5> 第四次準備進入循環時,發現a的值已經比5大了。因此,程序終止。最後a的值爲6,b的值也爲6。


5.常見使用易錯分析。

1> 在使用後綴形式的++和--時,(後綴形式:i++,i--)何時執行自增或自減操作?

    C語言標準引入了“順序點”的概念,並且指出“應該在前一個順序點和下一個順序點之間對存儲的操作數的值進行更新”。在C語言中有多種不同類型的順序點,表達式語句的末尾是其中的一種,在表達式語句的末尾,該語句中的所有自增和自減操作都必須執行完畢,否則不能進入下一條語句。(例:number = i++; 這句代碼  要先執行完:temp = i; number = temp; i = temp +1; 纔會執行下一句代碼。)

2>自增運算符不能用於表達式。

例:如果a = 0;b = 0;計算(a + b)++ 這個表達式的值。

  舉個例子讓你理解這個題目 假設a = 1,b = 2;那麼(a + b)之後等於3,因此3是一個常量,不再是變量,因此是錯誤的,也就是說++是不能對常量進行操作的,也就是不能這樣使用5++。

  其次,a++是與a = a + 1是等效的,也就是說執行a++後,變量a的值本來是1,但執行後就變爲2了,而常量的值是不能改變的,也就是說執行5++之後,不可能把5變爲6,因此常量不能使用++運算符操作。

  所以,在這裏不能用 j = ++i++ 來判斷前綴++和後綴++的優先級是錯誤的,因爲不管是前綴++還是後綴++的優先級高,總有一個是對表達式操作的,也就是對常量操作的。


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