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;
}