PrePost IncrementDecrement 運算子

在 C 中,有兩個一元運算子 - ‘++‘和’ - ‘是非常常見的混淆源。運算子++稱為遞增運算子,運算子 -- 稱為遞減運算子。它們都可以用於字首形式或字尾形式。++運算子的字首形式的語法是++operand,字尾形式的語法是 operand++。當在字首形式中使用時,運算元首先由 1 遞增,並且運算元的結果值用於表示式的求值。請考慮以下示例:

int n, x = 5;
n = ++x; /* x is incremented  by 1(x=6), and result is assigned to n(6) */
         /* this is a short form for two statements: */
         /* x = x + 1; */ 
         /* n = x ; */

在字尾形式中使用時,運算元的當前值在表示式中使用,然後運算元的值增加 1。請考慮以下示例:

int n, x = 5;
n = x++; /* value of x(5) is assigned first to n(5), and then x is incremented by 1; x(6) */
         /* this is a short form for two statements: */
         /* n = x; */
         /* x = x + 1; */

可以類似地理解減量運算子 -- 的工作。

以下程式碼演示了每個人的功能

    int main()
    {
        int a, b, x = 42;
        a = ++x; /* a and x are 43 */
        b = x++; /* b is 43, x is 44 */
        a = x--; /* a is is 44, x is 43 */
        b = --x; /* b and x are 42 */
        
        return 0;
    }

從上面可以清楚地看出,post 運算子返回變數的當前值然後修改它,但是 pre 運算子修改變數然後返回修改後的值。

在 C 的所有版本中,未定義前置和後置運算子的求值順序,因此以下程式碼可以返回意外輸出:

    int main()
    {
        int a, x = 42;
        a = x++ + x; /* wrong */
        a = x + x; /* right */
        ++x;

        int ar[10];
        x = 0;
        ar[x] = x++; /* wrong */
        ar[x++] = x; /* wrong */
        ar[x] = x; /* right */
        ++x;
        return 0;
    }

請注意,在宣告中單獨使用 pre pre post 運算子也是一種好習慣。請看上面的程式碼。

另請注意,在呼叫函式時,必須在函式執行之前對引數產生所有副作用。

    int foo(int x)
    {
        return x;
    }

    int main()
    {
        int a = 42;
        int b = foo(a++);  /* This returns 43, even if it seems like it should return 42 */
        return 0;
    }