- 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 - 返回语句
- 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 - 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语言中的单个表达式可能包含多种不同类型的运算符。C编译器根据运算符的优先级和结合性来评估其值。
运算符的优先级决定了它们在表达式中计算的顺序。优先级较高的运算符先计算。
例如,请看以下表达式:
x = 7 + 3 * 2;
这里,乘法运算符“*”的优先级高于加法运算符“+”。因此,首先执行乘法 3*2,然后将其结果加到 7 中,最终结果为“x = 13”。
下表列出了C语言中运算符的优先级顺序。这里,优先级最高的运算符位于表的上方,优先级最低的运算符位于表的下方。
类别 | 运算符 | 结合性 |
---|---|---|
后缀 | () [] -> . ++ - - | 从左到右 |
一元 | + - ! ~ ++ -- (type)* & sizeof | 从右到左 |
乘法 | * / % | 从左到右 |
加法 | + - | 从左到右 |
移位 | << >> | 从左到右 |
关系 | < <= > >= | 从左到右 |
相等 | == != | 从左到右 |
按位与 | & | 从左到右 |
按位异或 | ^ | 从左到右 |
按位或 | | | 从左到右 |
逻辑与 | && | 从左到右 |
逻辑或 | || | 从左到右 |
条件 | ?: | 从右到左 |
赋值 | = += -= *= /= %=>>= <<= &= ^= |= | 从右到左 |
逗号 | , | 从左到右 |
在表达式中,优先级较高的运算符将首先计算。
运算符结合性
在C语言中,运算符的结合性指的是在程序中表达式计算的方向(从左到右或从右到左)。当两个具有相同优先级的运算符出现在表达式中时,就会用到运算符的结合性。
在下面的示例中:
15 / 5 * 2
“/”(除法)和“*”(乘法)运算符具有相同的优先级,因此计算顺序将由结合性决定。
根据上表,乘法运算符的结合性是从左到右。因此,表达式将按以下方式计算:
(15 / 5) * 2
计算结果为:
3 * 2 = 6
示例 1
在以下代码中,乘法和除法运算符的优先级高于加法运算符。
乘法运算符的从左到右结合性导致“b”和“c”相乘再除以“e”。然后将结果加到“a”的值上。
#include <stdio.h> int main(){ int a = 20; int b = 10; int c = 15; int d = 5; int e; e = a + b * c / d; printf("e : %d\n" , e ); return 0; }
输出
运行此代码时,将产生以下输出:
e: 50
示例 2
我们可以使用括号来更改计算顺序。括号 () 在所有 C 运算符中具有最高优先级。
#include <stdio.h> int main(){ int a = 20; int b = 10; int c = 15; int d = 5; int e; e = (a + b) * c / d; printf("e: %d\n", e); return 0; }
输出
运行代码并检查其输出:
e: 90
在这个表达式中,首先计算括号中的 a 和 b 的加法。结果乘以 c,然后除以 d。
示例 3
在计算 e 的表达式中,我们将 a+b 放到一个括号中,将 c/d 放到另一个括号中,并将两个结果相乘。
#include <stdio.h> int main(){ int a = 20; int b = 10; int c = 15; int d = 5; int e; e = (a + b) * (c / d); printf("e: %d\n", e ); return 0; }
输出
运行此代码后,您将获得以下输出:
e: 90
后缀/前缀自增/自减运算符的优先级
“++”和“--”运算符分别充当自增和自减运算符。它们本质上是一元的,可以作为变量的前缀或后缀使用。
当单独使用时,以前缀或后缀方式使用这些运算符具有相同的效果。换句话说,“a++”与“++a”具有相同的效果。但是,当这些“++”或“--”运算符与表达式中的其他运算符一起出现时,它们的行为会有所不同。
后缀自增和自减运算符的优先级高于前缀自增和自减运算符。
示例
以下示例展示了如何在 C 程序中使用自增和自减运算符:
#include <stdio.h> int main(){ int x = 5, y = 5, z; printf("x: %d \n", x); z = x++; printf("Postfix increment: x: %d z: %d\n", x, z); z = ++y; printf("Prefix increment. y: %d z: %d\n", y ,z); return 0; }
输出
运行代码并检查其输出:
x: 5 Postfix increment: x: 6 z: 5 Prefix increment. y: 6 z: 6
逻辑运算符具有从左到右的结合性。但是,编译器会评估确定表达式结果所需的最小操作数。因此,表达式的某些操作数可能不会被评估。
例如,请看以下表达式:
x > 50 && y > 50
这里,第二个操作数“y > 50”仅在第一个表达式计算结果为真时才会被评估。