C语言运算符的优先级和结合性
本节我们从一个例子入手讲解,请看下面的代码:
d=24, e=8
1) 对于表达式
先计算乘法后计算加法,说明乘法运算符的优先级比加法运算符的优先级高。所谓优先级,就是当多个运算符出现在同一个表达式中时,先执行哪个运算符。
C语言有几十种运算符,被分成十几个级别,有的运算符优先级不同,有的运算符优先级相同,我们在《C语言运算符的优先级和结合性一览表》中给出了详细的说明,大家可以点击链接自行查阅。
一下子记住所有运算符的优先级并不容易,还好C语言中大部分运算符的优先级和数学中是一样的,大家在以后的编程过程中也会逐渐熟悉起来。如果实在搞不清,可以加括号,就像下面这样:
2) 对于表达式
按照数学规则应该从左到右,先计算除法,在计算乘法;
当乘法和除法的优先级相同时,编译器很明显知道先执行除法,再执行乘法,这是根据运算符的结合性来判定的。所谓结合性,就是当一个表达式中出现多个优先级相同的运算符时,先执行哪个运算符:先执行左边的叫左结合性,先执行右边的叫右结合性。
3) 像 +、-、*、/ 这样的运算符,它的两边都有要计算的数据,每份这样的数据都称作一个操作数,一个运算符需要 n 个操作数就称为 n 目运算符。例如:
C语言的运算符众多,每个运算符都具有优先级和结合性,还拥有若干个操作数,为了方便记忆和对比,我们在《C语言运算符的优先级和结合性一览表》中将它们全部列了出来。对于没有学到的运算符,大家不必深究,一带而过即可,等学到时再来回顾。
#include <stdio.h> int main(){ int a = 16, b = 4, c = 2; int d = a + b * c; int e = a / b * c; printf( "d=%d, e=%d\n", d, e); return 0; }运行结果:
d=24, e=8
1) 对于表达式
a + b * c
,如果按照数学规则推导,应该先计算乘法,再计算加法;b * c
的结果为 8,a + 8
的结果为 24,所以 d 最终的值也是 24。从运行结果可以看出,我们的推论得到了证实,C语言也是先计算乘法再计算加法,和数学中的规则一样。先计算乘法后计算加法,说明乘法运算符的优先级比加法运算符的优先级高。所谓优先级,就是当多个运算符出现在同一个表达式中时,先执行哪个运算符。
C语言有几十种运算符,被分成十几个级别,有的运算符优先级不同,有的运算符优先级相同,我们在《C语言运算符的优先级和结合性一览表》中给出了详细的说明,大家可以点击链接自行查阅。
一下子记住所有运算符的优先级并不容易,还好C语言中大部分运算符的优先级和数学中是一样的,大家在以后的编程过程中也会逐渐熟悉起来。如果实在搞不清,可以加括号,就像下面这样:
int d = a + (b * c);括号的优先级是最高的,括号中的表达式会优先执行,这样各个运算符的执行顺序就一目了然了。
2) 对于表达式
a / b * c
,查看了《C语言运算符的优先级和结合性一览表》的读者会发现,除法和乘法的优先级是相同的,这个时候到底该先执行哪一个呢?按照数学规则应该从左到右,先计算除法,在计算乘法;
a / b
的结果是 4,4 * c
的结果是 8,所以 e 最终的值也是 8。这个推论也从运行结果中得到了证实,C语言的规则和数学的规则是一样的。当乘法和除法的优先级相同时,编译器很明显知道先执行除法,再执行乘法,这是根据运算符的结合性来判定的。所谓结合性,就是当一个表达式中出现多个优先级相同的运算符时,先执行哪个运算符:先执行左边的叫左结合性,先执行右边的叫右结合性。
/
和*
的优先级相同,又都具有左结合性,所以先执行左边的除法,再执行右边的乘法。3) 像 +、-、*、/ 这样的运算符,它的两边都有要计算的数据,每份这样的数据都称作一个操作数,一个运算符需要 n 个操作数就称为 n 目运算符。例如:
- +、-、*、/、= 是双目运算符;
- ++、-- 是单目运算符;
- ? : 是三目运算符(这是C语言里唯一的一个三目元算符,后续我们将会讲解)。
总结
当一个表达式中出现多个运算符时,C语言会先比较各个运算符的优先级,按照优先级从高到低的顺序依次执行;当遇到优先级相同的运算符时,再根据结合性决定先执行哪个运算符:如果是左结合性就先执行左边的运算符,如果是右结合性就先执行右边的运算符。C语言的运算符众多,每个运算符都具有优先级和结合性,还拥有若干个操作数,为了方便记忆和对比,我们在《C语言运算符的优先级和结合性一览表》中将它们全部列了出来。对于没有学到的运算符,大家不必深究,一带而过即可,等学到时再来回顾。
所有教程
- C语言入门
- C语言编译器
- C语言项目案例
- 数据结构
- C++
- STL
- C++11
- socket
- GCC
- GDB
- Makefile
- OpenCV
- Qt教程
- Unity 3D
- UE4
- 游戏引擎
- Python
- Python并发编程
- TensorFlow
- Django
- NumPy
- Linux
- Shell
- Java教程
- 设计模式
- Java Swing
- Servlet
- JSP教程
- Struts2
- Maven
- Spring
- Spring MVC
- Spring Boot
- Spring Cloud
- Hibernate
- Mybatis
- MySQL教程
- MySQL函数
- NoSQL
- Redis
- MongoDB
- HBase
- Go语言
- C#
- MATLAB
- JavaScript
- Bootstrap
- HTML
- CSS教程
- PHP
- 汇编语言
- TCP/IP
- vi命令
- Android教程
- 区块链
- Docker
- 大数据
- 云计算