C 语言自增自减运算符完全指南:用法、优先级与最佳实践
C 语言 - 自增 (++) 与自减 (--) 运算符
自增运算符 (++) 将变量值加 1,自减运算符 (--) 将变量值减 1。
自增自减运算符常用于 C 语言计数循环(配合 for 循环)的构建,也用于数组遍历和指针运算。
++ 和 -- 是一元运算符,可作为变量的前缀或后缀使用。
自增自减运算符示例
下例演示自增自减运算符的多种变体用法:
#include <stdio.h>
int main() {
int a = 5, b = 5, c = 5, d = 5;
a++; // 后缀自增
++b; // 前缀自增
c--; // 后缀自减
--d; // 前缀自减
printf("a = %d\n", a);
printf("b = %d\n", b);
printf("c = %d\n", c);
printf("d = %d\n", d);
return 0;
}
输出
运行代码将产生以下输出:
a = 6
b = 6
c = 4
d = 4
示例解析
换言之,a++ 与 ++a 效果相同,都将变量 a 的值加 1。同理,a-- 与 --a 效果相同。
表达式 a++; 等价于语句 a = a + 1;。右侧表达式给 a 加 1,结果赋回 a,从而使 a 的值加 1。
类似地,b--; 等价于 b = b - 1;。
自增运算符的类型
自增运算符分两种——前置自增 和 后置自增。
前置自增运算符
在表达式中,前置自增运算符在使用变量值之前将变量值加 1。
语法
++variable_name;
示例
下例使用前置自增,x 的值先加 1,再用于表达式:
#include <stdio.h>
int main() {
int x = 10;
int y = 10 + ++x;
printf("x = %d, y = %d\n", x, y);
return 0;
}
运行输出:
x = 11, y = 21
后置自增运算符
在表达式中,后置自增运算符在使用变量值之后将变量值加 1。
语法
variable_name++;
示例
下例使用后置自增,x 的值先用于表达式,再加 1:
#include <stdio.h>
int main() {
int x = 10;
int y = 10 + x++;
printf("x = %d, y = %d\n", x, y);
return 0;
}
运行输出:
x = 11, y = 20
自减运算符的类型
自减运算符分两种——前置自减 和 后置自减。
前置自减运算符
在表达式中,前置自减运算符在使用变量值之前将变量值减 1。
语法
--variable_name;
示例
下例使用前置自减,x 的值先减 1,再用于表达式:
#include <stdio.h>
int main() {
int x = 10;
int y = 10 + --x;
printf("x = %d, y = %d\n", x, y);
return 0;
}
运行输出:
x = 9, y = 19
后置自减运算符
在表达式中,后置自减运算符在使用变量值之后将变量值减 1。
语法
variable_name--;
示例
下例使用后置自减,x 的值先用于表达式,再减 1:
#include <stdio.h>
int main() {
int x = 10;
int y = 10 + x--;
printf("x = %d, y = %d\n", x, y);
return 0;
}
运行输出:
x = 9, y = 20
更多自增自减运算符示例
示例 1:前缀/后缀自增自减对比
下例突出展示前缀/后缀自增自减的用法:
#include <stdio.h>
int main(){
char a = 'a', b = 'M';
int x = 5, y = 23;
printf("a: %c b: %c\n", a, b);
a++;
printf("postfix increment a: %c\n", a);
++b;
printf("prefix increment b: %c\n", b);
printf("x: %d y: %d\n", x, y);
x--;
printf("postfix decrement x : %d\n", x);
--y;
printf("prefix decrement y : %d\n", y);
return 0;
}
输出
a: a b: M
postfix increment a: b
prefix increment b: N
x: 5 y: 23
postfix decrement x: 4
prefix decrement y: 22
上例显示前缀和后缀运算符对操作数变量值的最终效果相同。但当 ++ 或 -- 与其他运算符共同出现在表达式中时,行为不同。
示例 2:printf 中的前缀 vs 后缀差异
下面代码中 x 和 y 初始值相同,但 printf() 显示不同值:
#include <stdio.h>
int main(){
int x = 5, y = 5;
printf("x: %d y: %d\n", x,y);
printf("postfix increment x: %d\n", x++);
printf("prefix increment y: %d\n", ++y);
return 0;
}
输出
x: 5 y: 5
postfix increment x: 5
prefix increment y: 6
第一种情况,printf() 先打印 x 的值再自增。第二种情况,自增运算符先执行,printf() 使用自增后的值打印。
自增自减运算符的优先级
C 语言有多种运算符。表达式中使用多个运算符时,按优先级顺序执行。自增自减运算符与其他运算符结合时行为不同。
表达式包含自增自减运算符和其他运算符时,自增自减运算优先执行。后缀自增自减运算符优先级高于前缀自增自减运算符。
延伸阅读: C 语言运算符优先级
示例 1:赋值运算符 vs 后缀自增
#include <stdio.h>
int main(){
int x = 5, z;
printf("x: %d \n", x);
z = x++;
printf("x: %d z: %d\n", x, z);
return 0;
}
输出
x: 5
x: 6 z: 5
x++ 将 x 增至 6,本期望 z 也为 6。但结果显示 z 为 5。因为赋值运算符优先级高于后缀自增。所以 x 的原值先赋给 z,再自增 x。
示例 2:前缀自增 vs 赋值运算符
#include <stdio.h>
int main(){
int x = 5, y = 5, z;
printf("x: %d y: %d\n", x,y);
z = ++y;
printf("y: %d z: %d\n", y ,z);
return 0;
}
输出
y: 5
y: 6 z: 6
结果可能令人困惑:y 和 z 都是 6。原因是前缀自增优先级高于赋值运算符。y 先自增,新值再赋给 z。
运算符结合性也很重要。自增自减运算符结合性为从左到右。因此表达式中有多个自增自减运算符时,最左边的先执行,向右依次进行。
示例 3:混合前缀后缀的复杂表达式
此例赋值表达式同时包含前缀和后缀运算符。
#include <stdio.h>
int main(){
int x = 5, y = 5, z;
z = x++ + ++y;
printf("x: %d y: %d z: %d\n", x,y,z);
return 0;
}
输出
x: 6 y:6 z: 11
本例中,首先执行 ++y (y 变为 6)。其次 + 运算符将 x (值 5) 和 y 相加,结果 11 赋给 z,最后 x++ 将 x 增至 6。
循环中使用自增运算符
C 语言 for 循环最常用语法如下:
for (init_val; final_val; increment) {
statement(s);
}
示例
循环体对变量在初始值和最终值之间的所有值执行,每轮自增一次。
#include <stdio.h>
int main(){
int x;
for (x = 1; x <= 5; x++){
printf("x: %d\n", x);
}
return 0;
}
输出
x: 1
x: 2
x: 3
x: 4
x: 5
C语言
- C++ 运算符全解析:类型、示例与示例程序
- C++ 函数详解:从声明到调用的实战指南
- C++ 三种继承方式深度解析:public、protected 与 private
- 精通 C# 数组:声明、初始化与整数集合操作实战
- C 语言循环完全指南:for、while、do-while 语法与实战案例
- C# 枚举完全指南:定义、使用、底层类型与实战技巧
- C 语言存储类详解:作用域、生命周期与四大类型实战
- C# 类与对象:面向对象编程的基石
- 掌握 C# 方法重载:核心概念、实战示例与最佳实践
- C 语言数组完全指南:声明、初始化、访问与常见操作
- C# 不安全代码完全指南:指针操作与内存管理
- C++ 函数重写详解:实战示例与最佳实践