遞增/遞減運算子
遞增/遞減運算子是一元運算子,用於將變數的值增加/減少 1。
它們可以有後綴形式
expr ++ |
|||||||||
expr -- |
|||||||||
以及字首形式
++ expr |
|||||||||
-- expr |
|||||||||
字首和字尾遞增或遞減運算子的運算元 expr 必須是可修改的左值,其型別為整數型別(包括 _Bool
和列舉)、實浮點型別或指標型別。它可以是 cvr 限定、非限定或原子型別。
字尾遞增和遞減運算子的結果是 expr 的值。
字首遞增運算子的結果是將值 1
新增到 expr 的值的結果:表示式 ++e 等價於 e += 1。字首遞減運算子的結果是從 expr 的值中減去值 1
的結果:表示式 --e 等價於 e -= 1。
遞增運算子會引發向運算元新增適當型別的值 1
的副作用。遞減運算子會引發從運算元減去適當型別的值 1
的副作用。與任何其他副作用一樣,這些操作在下一個序列點或之前完成。
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
對任何原子變數的後遞增或後遞減是具有記憶體順序 memory_order_seq_cst 的原子讀-改-寫操作。 |
(C11 起) |
有關指標算術的限制以及應用於運算元的隱式轉換,請參閱算術運算子。
目錄 |
[編輯] 注意
由於涉及副作用,遞增和遞減運算子必須謹慎使用,以避免由於違反排序規則而導致的未定義行為。
遞增/遞減運算子未定義用於複數或虛數型別:通常定義為加/減實數 1 對虛數型別沒有影響,而如果使其對虛數加/減 i
但對複數加/減 1
,則會使 0+yi
與 yi
的處理方式不同。
與 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 |
+a |
!a |
a == b |
a[b] |
a(...) |
C++ 文件,關於 遞增/遞減運算子
|