命名空間
變體
動作

遞增/遞減運算子

出自 cppreference.com
< c‎ | 語言

遞增/遞減運算子是一元運算子,用於將變數的值增加或減少 1。

它們可以採取後置形式

expr ++
expr --

以及前置形式

++ expr
-- expr

前置與後置遞增或遞減的運算元 expr 必須是 可修改左值 (modifiable lvalue),且型別須為 整數型別(包含 _Bool 與列舉)、實數浮點型別,或指標型別。它可以是經 cvr 修飾、未修飾或 原子 (atomic) 型別。

後置遞增與遞減運算子的結果為 expr 的原始值。

前置遞增運算子的結果是將 expr 的值加上 1 後的結果:表達式 ++e 等同於 e += 1。前置遞減運算子的結果是將 expr 的值減去 1 後的結果:表達式 --e 等同於 e -= 1

遞增運算子會啟動將適當型別的值 1 加到運算元上的副作用。遞減運算子會啟動將適當型別的值 1 從運算元中減去的副作用。與任何其他副作用一樣,這些運算會在下一個 順序點 (sequence point) 處或之前完成。

int a = 1;
int b = a++; // stores 1+a (which is 2) to a
             // returns the old value of a (which is 1)
             // After this line, b == 1 and a == 2
a = 1;
int c = ++a; // stores 1+a (which is 2) to a
             // returns 1+a (which is 2)
             // after this line, c == 2 and a == 2

對任何 原子變數 (atomic variable) 進行後置遞增或後置遞減,屬於記憶體順序為 memory_order_seq_cst 的原子讀-改-寫 (read-modify-write) 運算。

(自 C11 起)

關於指標算術的限制,以及應用於運算元的隱含轉換,請參閱 算術運算子

目錄

[編輯] 附註

由於涉及副作用,使用遞增與遞減運算子時必須格外小心,以避免因違反 定序規則 (sequencing rules) 而導致未定義行為。

遞增/遞減運算子未定義於複數或虛數型別:將實數 1 加/減的一般定義對虛數型別無效;若將虛數定義為加/減 i 而對複數加/減 1,則會導致 0+yiyi 的處理方式不一致。

與 C++(以及某些 C 實作)不同,遞增/遞減表達式本身絕不是左值:&++a 是無效的。

[編輯] 範例

#include <stdio.h>
#include <stdlib.h>
 
int main(void)
{
    int a = 1;
    int b = 1;
 
    printf("original values: a == %d, b == %d\n", a, b);
    printf("result of postfix operators: a++ == %d, b-- == %d\n", a++, b--);
    printf("after postfix operators applied: a == %d, b == %d\n", a, b);
    printf("\n");
 
    // Reset a and b.
    a = 1;
    b = 1;
 
    printf("original values: a == %d, b == %d\n", a, b);
    printf("result of prefix operators: ++a == %d, --b == %d\n", ++a, --b);
    printf("after prefix operators applied: a == %d, b == %d\n", a, b);
}

輸出

original values: a == 1, b == 1
result of postfix operators: a++ == 1, b-- == 1
after postfix operators applied: a == 2, b == 0
 
original values: a == 1, b == 1
result of prefix operators: ++a == 2, --b == 0
after prefix operators applied: a == 2, b == 0

[編輯] 參考資料

  • C23 標準 (ISO/IEC 9899:2024)
  • 6.5.2.4 後置遞增與遞減運算子 (p: TBD)
  • 6.5.3.1 前置遞增與遞減運算子 (p: TBD)
  • C17 標準 (ISO/IEC 9899:2018)
  • 6.5.2.4 後置遞增與遞減運算子 (p: TBD)
  • 6.5.3.1 前置遞增與遞減運算子 (p: TBD)
  • C11 標準 (ISO/IEC 9899:2011)
  • 6.5.2.4 後置遞增與遞減運算子 (p: 85)
  • 6.5.3.1 前置遞增與遞減運算子 (p: 88)
  • C99 標準 (ISO/IEC 9899:1999)
  • 6.5.2.4 後置遞增與遞減運算子 (p: 75)
  • 6.5.3.1 前置遞增與遞減運算子 (p: 78)
  • C89/C90 標準 (ISO/IEC 9899:1990)
  • 3.3.2.4 後置遞增與遞減運算子
  • 3.3.3.1 前置遞增與遞減運算子

[編輯] 參見

運算子優先級

常用運算子
賦值 遞增
遞減
算術 邏輯 比較 成員
存取
其他

a = b
a += b
a -= b
a *= b
a /= b
a %= b
a &&= b
a |= b
a ^= b
a <<= b
a >>= b

++a
--a
a++
a--

+a
-a
a + b
a - b
a * b
a / b
a % b
~a
a & b
a | b
a ^ b
a << b
a >> b

!a
a && b
a || b

a == b
a != b
a < b
a > b
a <= b
a >= b

a[b]
*a
&a
a->b
a.b

a(...)
a, b
(型別) a
a ? b : c
sizeof


_Alignof
(自 C11 起)
(C23 之前)

alignof
(C23 起)

C++ 文件 關於 遞增/遞減運算子
English Deutsch 日本語 한국어 中文(简体) 中文(繁體)