1.++i
++i和等同於
1 i = i + 1;
2.i++
i++可以等同於
1 int temp = i; // 一個與i類型相同的臨時變量
2 i = i + 1;
3.相同點和不同點
相同點:i最後都會被加1;
不同點:在i++中多了一個與i類型相同的臨時變量,i++是右值,++i是左值。
例子1:
1 int a = 1, b = 2;
2 int *pt;
3 pt = &a;
4
5 pt++ = &b; // 錯誤
6 //上式等價於
7 //int *temp = pt;
8 //temp = &b; 給一個臨時指針變量賦值無意義
9 //pt = pt + 1;
10
11 *pt++ = b; // 正確
12 //int *temp = pt;
13 // *temp = b; => a = b; 起到臨時指針變量的作用
14 // pt = pt + 1;
例子2:
1 int fun()
2 {
3 int i = 0;
4 return i++;
5 }
6 // 等價於
7 int fun()
8 {
9 int i = 0;
10 int temp = i;
11 i = i+ 1;
12 return temp;
13 }
14 // 根據C11,i++和return之間存在序列點,i++在序列點之前,序列
15 //點之前的表達式及其副作用會被先計算,計算完之後return纔會被執行
例子3:
1 #include <stdio.h>
2 int main(void)
3 {
4 int a = 5;
5 int *p = &a;
6 int b = (*p)++; //等價於b = a++; 即b = a; a = a + 1;
7 int c = ++(*p); //等價於c = ++a; 即a = a + 1; c = a;
8 printf("b = %d, c = %d\n", b, c);
9 printf("(*p)++ = %d, ++(*p) = %d\n", (*p)++, ++(*p));
10 return 0;
11 }
12 例子輸出結果:
13 b = 5, c = 7 ;
14 (*p)++ = 8, ++(*p) = 8
對於行9的情況應該避免,作爲printf函數的參數(*p)++和 ++(*p)的計算沒有先後順序,依賴於編譯器,因此在不同的編譯器會產生不同的結果。