1. 程式人生 > >i++與++i的運算規則

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

那看到這裡,你肯定又有問題了,自增、自減什麼時候算作是使用結束呢?

答案是遇到逗號(,)、分號(;)、圓括號()算是使用結束了。

最後來總結一下,自增自減關鍵在於掌握使用結束之前的值和使用結束之後的值。另外呢,自減是自增的相反,和自增類似,這裡我也不再講述。相信通過這次學習,你也能掌握自增、自減的運算了吧!