i++與++i的運算規則
1. 我們都知道自增運算子和自減運算子,如:i++ 和 ++i,i-- 和 i--。可能你會覺得這很簡單,不就是 i+1、i-1嗎?但是你真的深入的瞭解過嗎?
這裡我要提到非常重要的一點,關於 i++ 與++i 的區別。i++是先使用 i 的值,再進行 i+1。而++i 是先進行 i+1,再使用 i 的值。這是它們的本質區別!
2. 關於這裡運算子優先順序。首先自增、自減的優先順序高,先進行自增和自減,然後再進行加法運算,結合方向自左至右,最後才是賦值運算。
例如:*p++ --> 由於++和*的優先順序一樣,不過它們的結合方向是自右向左。所有要先進行p++,然後再*p,最後p = p + 1。
*tab++ = *tmp++; 等效於*tab = *tmp; tab++; tmp++;
3. 下面如果用printf列印自增和自減運算,那結果又會變成什麼樣呢?
#include <stdio.h>
int main(void) {
int i = 2;
printf("%d %d %d %d %d\n", i++, i++, ++i, ++i, i++);
return 0;
}
[root@localhost 0715]# ./add_add
6 5 7 7 2
當我們用printf列印自增和自減運算的時候,我們發現這和我們想象中的一點都不一樣。這是為什麼呢?
原來函式的傳參是自右向左的,而printf是系統提供給我們使用的函式,雖然我們不知道它如何實現,但是我們可以使用printf。
講到這裡,我覺得再看幾個例子,你才能總計出它的用法。
#include <stdio.h>
int main(void) {
int i = 2;
printf("%d %d %d %d %d\n", i++, ++i, i++, i++, ++i);
return 0;
}
[root@localhost 0715]# ./add_add
6 7 4 3 7
可以通過這兩個例子發現有幾個++i ,就有幾個值相等,而且它們的值最大。可以總結出一句話來:i++被替換成數值,而++i 被替換成變數名。
在第一個例子中,從最右邊開始,2(3) --> i(4) --> i(5) --> 5(6) --> 6(7)。右邊括號中的值是使用結束之後的值,所以最後 i = 7,即答案為6 5 7 7 2
在第二個例子中,從最右邊開始,i(3) --> 3(4) --> 4(5) --> i(6) --> 6(7)。右邊括號中的值是使用結束之後的值,所以最後 i = 7,即答案為6 7 4 3 7
那看到這裡,你肯定又有問題了,自增、自減什麼時候算作是使用結束呢?
答案是遇到逗號(,)、分號(;)、圓括號()算是使用結束了。
最後來總結一下,自增自減關鍵在於掌握使用結束之前的值和使用結束之後的值。另外呢,自減是自增的相反,和自增類似,這裡我也不再講述。相信通過這次學習,你也能掌握自增、自減的運算了吧!