是 C 语言中的一个一元运算符,称为自减运算符 (Decrement Operator),它的作用是将变量的值减 1。

(图片来源网络,侵删)
运算符有两种使用方式,这导致了它最核心、也最容易让人混淆的特性:前缀模式和后缀模式。
前缀模式 --variable
语法:运算符 放在变量名前面。
行为:
- 先减:变量的值立即减 1。
- 后用:减 1 之后的新值被用于整个表达式。
简单记忆:先减,后用。

(图片来源网络,侵删)
示例代码:
#include <stdio.h>
int main() {
int a = 10;
int b;
// 使用前缀自减
b = --a;
printf("a 的值是: %d\n", a); // 输出: a 的值是: 9
printf("b 的值是: %d\n", b); // 输出: b 的值是: 9
return 0;
}
代码解释:
a的初始值是 10。- 执行
b = --a;时:a的值先从 10 减到 9。- 这个新值
9被赋给b。
- 最终
a和b的值都变成了 9。
后缀模式 variable--
语法:运算符 放在变量名后面。
行为:
- 先用:变量的原始值被用于整个表达式。
- 后减:表达式计算完毕后,变量的值再减 1。
简单记忆:先用,后减。
示例代码:
#include <stdio.h>
int main() {
int a = 10;
int b;
// 使用后缀自减
b = a--;
printf("a 的值是: %d\n", a); // 输出: a 的值是: 9
printf("b 的值是: %d\n", b); // 输出: b 的值是: 10
return 0;
}
代码解释:
a的初始值是 10。- 执行
b = a--;时:a的原始值 10 被先赋给b。a的值再从 10 减到 9。
- 最终
b的值是10(原始值),而a的值是9(减 1 后的值)。
| 特性 | 前缀模式 (--a) |
后缀模式 (a--) |
|---|---|---|
| 执行顺序 | 先减,后用 | 先用,后减 |
| 表达式的值 | 变量减 1 之后的值 | 变量减 1 之前的值 |
| 变量最终值 | 都会减 1 | 都会减 1 |
无论哪种模式,变量 a 最终的值都会减 1。唯一的关键区别是赋值给 b 的那个表达式的值是什么。
在更复杂表达式中的应用
这种区别在更复杂的表达式中尤为重要。
示例 1:后缀模式
int a = 5; int b = a-- + 3; // 等价于 int b = 5 + 3; a = a - 1; // 结果: b = 8, a = 4
示例 2:前缀模式
int a = 5; int b = --a + 3; // 等价于 a = a - 1; int b = 4 + 3; // 结果: b = 7, a = 4
常见陷阱与最佳实践
避免在同一个表达式中多次修改同一个变量
这是一个非常常见的错误,因为 C 语言的运算符求值顺序是“未定义的”(undefined behavior),编译器可以自由决定先计算哪一部分。
错误示例:
int x = 5; int y = --x + x++; // 危险!行为不可预测!
这个表达式的结果取决于编译器,有的可能先算 --x,有的可能先算 x++。永远不要这样写。
最佳实践:一行只做一件事
为了代码清晰和避免错误,建议将自增/自减操作与赋值或复杂的计算分开。
推荐写法:
// 清晰、无歧义 int a = 10; int b = a; a = a - 1; // 或者 a--; // 或者 int a = 10; a = a - 1; int b = a;
虽然这多了一行代码,但它极大地提高了代码的可读性和可维护性,是专业程序员常用的做法。
与自增运算符 的关系
的所有规则都完全适用于它的兄弟运算符 (自增运算符)。
++a(前缀自增):先加 1,后用。a++(后缀自增):先用,后加 1。
是 C 语言中一个功能强大但需要小心使用的运算符。
- 核心功能:将变量值减 1。
- 两种模式:
- 前缀
--a:先减,后用,表达式的值是a-1。 - 后缀
a--:先用,后减,表达式的值是a的原始值。
- 前缀
- 关键:两种模式都会改变变量的最终值,区别在于表达式的返回值。
- 忠告:为了代码的清晰和稳定,避免在单个复杂表达式中对同一个变量使用多个 或 。
