- C编程教程
- C语言 - 首页
- C语言基础
- C语言 - 概述
- C语言 - 特性
- C语言 - 历史
- C语言 - 环境搭建
- C语言 - 程序结构
- C语言 - Hello World
- C语言 - 编译过程
- C语言 - 注释
- C语言 - 词法单元
- C语言 - 关键字
- C语言 - 标识符
- C语言 - 用户输入
- C语言 - 基本语法
- C语言 - 数据类型
- C语言 - 变量
- C语言 - 整数提升
- C语言 - 类型转换
- C语言 - 类型强制转换
- C语言 - 布尔值
- C语言中的常量和字面量
- C语言 - 常量
- C语言 - 字面量
- C语言 - 转义序列
- C语言 - 格式说明符
- C语言中的运算符
- C语言 - 运算符
- C语言 - 算术运算符
- C语言 - 关系运算符
- C语言 - 逻辑运算符
- C语言 - 位运算符
- C语言 - 赋值运算符
- C语言 - 一元运算符
- C语言 - 自增和自减运算符
- C语言 - 三元运算符
- C语言 - sizeof运算符
- C语言 - 运算符优先级
- C语言 - 其他运算符
- C语言中的决策
- C语言 - 决策
- C语言 - if语句
- C语言 - if...else语句
- C语言 - 嵌套if语句
- C语言 - switch语句
- C语言 - 嵌套switch语句
- C语言中的循环
- C语言 - 循环
- C语言 - while循环
- C语言 - for循环
- C语言 - do...while循环
- C语言 - 嵌套循环
- C语言 - 无限循环
- C语言 - break语句
- C语言 - continue语句
- C语言 - goto语句
- C语言中的函数
- C语言 - 函数
- C语言 - 主函数
- C语言 - 按值调用函数
- C语言 - 按引用调用函数
- C语言 - 嵌套函数
- C语言 - 变参函数
- C语言 - 用户自定义函数
- C语言 - 回调函数
- C语言 - return语句
- C语言 - 递归
- C语言中的作用域规则
- C语言 - 作用域规则
- C语言 - 静态变量
- C语言 - 全局变量
- C语言中的数组
- C语言 - 数组
- C语言 - 数组的特性
- C语言 - 多维数组
- C语言 - 将数组传递给函数
- C语言 - 从函数返回数组
- C语言 - 可变长度数组
- C语言中的指针
- C语言 - 指针
- C语言 - 指针和数组
- C语言 - 指针的应用
- C语言 - 指针运算
- C语言 - 指针数组
- C语言 - 指向指针的指针
- C语言 - 将指针传递给函数
- C语言 - 从函数返回指针
- C语言 - 函数指针
- C语言 - 指向数组的指针
- C语言 - 指向结构体的指针
- C语言 - 指针链
- C语言 - 指针与数组
- C语言 - 字符指针和函数
- C语言 - NULL指针
- C语言 - void指针
- C语言 - 悬空指针
- C语言 - 解引用指针
- C语言 - 近指针、远指针和巨指针
- C语言 - 指针数组的初始化
- C语言 - 指针与多维数组
- C语言中的字符串
- C语言 - 字符串
- C语言 - 字符串数组
- C语言 - 特殊字符
- C语言结构体和联合体
- C语言 - 结构体
- C语言 - 结构体和函数
- C语言 - 结构体数组
- C语言 - 自引用结构体
- C语言 - 查找表
- C语言 - 点(.)运算符
- C语言 - 枚举(enum)
- C语言 - 结构体填充和打包
- C语言 - 嵌套结构体
- C语言 - 匿名结构体和联合体
- C语言 - 联合体
- C语言 - 位域
- C语言 - typedef
- C语言中的文件处理
- C语言 - 输入与输出
- C语言 - 文件I/O (文件处理)
- C预处理器
- C语言 - 预处理器
- C语言 - 预处理指令
- C语言 - 预处理器运算符
- C语言 - 宏
- C语言 - 头文件
- C语言中的内存管理
- C语言 - 内存管理
- C语言 - 内存地址
- C语言 - 存储类别
- 其他主题
- C语言 - 错误处理
- C语言 - 可变参数
- C语言 - 命令执行
- C语言 - 数学函数
- C语言 - static关键字
- C语言 - 随机数生成
- C语言 - 命令行参数
- C编程资源
- C语言 - 问答
- C语言 - 快速指南
- C语言 - 速查表
- C语言 - 有用资源
- C语言 - 讨论
C语言中的自增和自减运算符
C语言 - 自增和自减运算符
自增运算符 (++) 将变量的值增加 1,而自减运算符 (--) 将变量的值减少 1。
自增和自减运算符经常用于构建 C 语言中的计数循环(使用for循环)。它们也应用于数组遍历和指针运算。
++ 和 -- 运算符是一元运算符,可以用作变量的前缀或后缀。
自增和自减运算符示例
下面的示例包含多个语句,演示了自增和自减运算符的不同用法:
#include <stdio.h> int main() { int a = 5, b = 5, c = 5, d = 5; a++; // postfix increment ++b; // prefix increment c--; // postfix decrement --d; // prefix decrement 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;”的等效形式。这里,右侧的表达式将 1 加到“a”,并将结果赋值回 1,从而将“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
在下面的代码中,“a”和“b”变量的初始值相同,但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
请看下面的例子:
#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”的现有值在自增“x”之前被赋值给“z”。
示例 2
再看下面的另一个例子:
#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