亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Industrial programming >> C语言

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语言

  1. C++ 运算符全解析:类型、示例与示例程序
  2. C++ 函数详解:从声明到调用的实战指南
  3. C++ 三种继承方式深度解析:public、protected 与 private
  4. 精通 C# 数组:声明、初始化与整数集合操作实战
  5. C 语言循环完全指南:for、while、do-while 语法与实战案例
  6. C# 枚举完全指南:定义、使用、底层类型与实战技巧
  7. C 语言存储类详解:作用域、生命周期与四大类型实战
  8. C# 类与对象:面向对象编程的基石
  9. 掌握 C# 方法重载:核心概念、实战示例与最佳实践
  10. C 语言数组完全指南:声明、初始化、访问与常见操作
  11. C# 不安全代码完全指南:指针操作与内存管理
  12. C++ 函数重写详解:实战示例与最佳实践