【C语言】计算含多种运算符的表达式

简介: 【C语言】计算含多种运算符的表达式

引入

诸如下面这些表达式,它的计算过程,计算顺序是怎样的?计算结果为多少?

今天我们就一起来解决一下这个问题吧!


运算符的优先级

解决这个问题,首先我们必须要了解清楚各种运算符的优先级。

首先,可以简单记,!!>算术运算符>关系运算符>&&>||>赋值运算符

再详细一点记的话,可以根据下面的口诀来记忆。

括号成员第一; //括号运算符[](),成员运算符.->

全体单目第二;//++ ,–,+(正),-(负),指针运算符*、&

乘除余三,加减四// 余即%取余运算符

位移五,关系六//位移运算符<< >>关系运算符>,<,≥,≤

等于(与)不等排第七// == 和! !=

位与异或和位或,三分天下,八九十//位与 &第八,异或^第九,位或|第十

逻辑或跟与,十二和十一//逻辑 或||十二,逻辑与&&十一

条件高于赋值//三目运算符优先级排到13位只比赋值运算符和逗号运算符高

逗号运算级最低//,运算级最低

更详细的可以看下面这张表(图片来源于)

算术表达式的运算规则

算术表达式的运算遵循运算符优先级和结合性的原则。

表达式运算的具体过程是:对表达式自左向右扫描运算对象,然后考察运算对象两侧的运算符,如果运算对象两侧的运算符优先级不相同则该运算对象和优先级的运算符结合;如果运算对象两侧的运算符优先级相同时,则按照运算符的结合性原则去结合,如果运算符是左结合的,则和左侧的运算符结合,如果是右结合的,则和右侧的运算符结合。当某运算符所需的运算对象全部都和该运算符结合后进行运算,运算后的中间结果就是下一个被扫描到的运算对象,当某运算符所需的运算对象没有全部结合则继续扫描下一个运算对象。

引例

了解了上面运算符的优先级之后,我们来举个例子说明一下。

int a=3,b=1;

则下述表达式的值为:

分析

表达式a+b*5/6的具体运算过程是:

①对该表达式自左向右扫描,扫描到的第1个运算对象是变量a,其左侧无运算符,右侧是运算符,于是a必须和+结合,而加法运算是双目运算,无法进行运算,于是继续扫描下一个运算对象;

②扫描到的第2个运算对象是变量b其左侧+运算符,右侧是运算符*,优先级高于+,于是b必须和*结合,而乘法运算是双目运算,无法进行运算,于是继续扫描下一个运算对象;

③扫描到的第3个运算对象是常量5,其左侧是*运算符,右侧是运算符/,优先级相同且是左结合的,于是5必须和*结合,乘法运算的双目都已经和*结合,于是完成b*5乘法运算,得到中间结果为5

中间结果5就是要扫描的第4个运算对象,其左侧运算符+,右侧是运算符/,的优先级于+,于是5必须和/结合,而除法运算是双目运算,无法进行运算,于是继续扫描下一个运算对象;

⑤扫描到的第5个运算对象是常量6,其左侧运算符/,右侧无运算符,于是6必须和/结合,除法运算的双目都已经和/结合,于是完成5/6除法运算,得到中间结果0

中间结果0就是要扫描的第6个运算对象,其左侧运算符+,右侧无运算符,于是0必须和结合,

加法运算的双目都已经和+结合,于是完成a+0加法运算,得到结果为3,运算结束,得到表达式的结果为值3。

图解如下:

(上方的序号是运算过程,下方的序号为运算对象的排序)

例题

(一)

int x=3,y=4,z=5;

计算下表达式的值

分析过程如例题所示。

最终结果为1。

(二)

int x=3,y=4,z=5;

计算下述表达式的值

分析过程如下:

int a=3,b=2,c=1,f;

计算下表达式的值:

f=a>b>c;

分析过程如下:

这个表达式含关系运算,关系运算的结果分为成立或者不成立,用逻辑量"0"和"1"表示。

关系运算符是左结合运算符。

故表达式的值为0;

(三)

int m=2,n=1,a=1,b=2,c=3;

则执行完上面这个表达式之后,n的值为 ? m的值为?

分析过程如下:

故执行完上述的过程之后,n的值为0,m的值为1。

(四)

int m=5,y=2;

则计算表达式

y+=y-=m*=y

这个表达式中含复合的算术赋值运算符

什么是复合的算术赋值运算符呢?

就是在赋值运算符"="前加上其他的运算符,从而构成复合的赋值运算符。

C语言提供了5种复合的算术赋值运算符,分别是+===*=/=%=,复合的算术运算符是双目运算符,优先级和赋值运算符相同,也是右结合性的。

这个表达式的分析过程如下:

故y的值为-16。

相关文章
|
3月前
|
存储 C语言
C语言数据类型、变量和运算符以及printf相关问题
C语言数据类型、变量和运算符以及printf相关问题
|
2月前
|
C语言
C语言判断和运算符联系
在 C 语言中,判断与运算符紧密相关,主要体现在条件表达式的使用上。
191 87
|
2月前
|
安全 C语言
C语言运算符的使用注意点
在C语言中,正确使用运算符能提升代码的可读性和效率。本文介绍了八大注意事项:运算符优先级和结合性影响运算顺序;自增/自减运算符分前缀和后缀形式;逻辑运算符有短路特性;位运算符直接操作二进制位需谨慎;条件运算符简洁但避免复杂嵌套;类型转换避免意外结果;使用括号明确运算顺序。掌握这些要点有助于编写更安全高效的代码。
181 72
|
29天前
|
存储 Java C语言
【一步一步了解Java系列】:了解Java与C语言的运算符的“大同小异”
【一步一步了解Java系列】:了解Java与C语言的运算符的“大同小异”
37 3
|
1月前
|
C语言
C语言条件运算符详解
C语言条件运算符,也称为三元运算符,是一种简化if-else语句的表达式,形式为:条件?表达式1:表达式2。当条件为真时,计算并返回表达式1的值;否则计算并返回表达式2的值。它可用于快速实现简单的条件分支逻辑。
|
5月前
|
存储 C语言
【C语言刷题每日一题#牛客网HJ73】——计算日期到天数转换(给定日期,计算是该年的第几天)
【C语言刷题每日一题#牛客网HJ73】——计算日期到天数转换(给定日期,计算是该年的第几天)
|
2月前
|
安全 C语言
在C语言中,正确使用运算符能提升代码的可读性和效率
在C语言中,运算符的使用需要注意优先级、结合性、自增自减的形式、逻辑运算的短路特性、位运算的类型、条件运算的可读性、类型转换以及使用括号来明确运算顺序。掌握这些注意事项可以帮助编写出更安全和高效的代码。
46 4
|
2月前
|
程序员 C语言
【C语言基础考研向】06运算符与表达式
本文介绍了C语言中的运算符分类、算术运算符及表达式、关系运算符与表达式以及运算符优先级等内容。首先概述了13种运算符类型,接着详细说明了算术运算符的优先级与使用规则,以及关系运算符和表达式的真假值表示,并给出了C语言运算符优先级表。最后附有课后习题帮助巩固理解。
103 10
|
2月前
|
存储 编译器 C语言
【C语言基础考研向】07逻辑运算符与赋值运算符
本文介绍了C语言中的逻辑运算符与逻辑表达式、赋值运算符以及求字节运算符`sizeof`。逻辑运算符包括`!`(逻辑非)、`&&`(逻辑与)和`||`(逻辑或),其优先级规则与数学运算符类似。通过示例展示了如何用这些运算符判断闰年及逻辑非的运算方向。此外,文章还解释了左值与右值的概念及其在赋值运算中的应用,并介绍了复合赋值运算符的使用方法,如加后赋值`+=`和乘后赋值`*=`。最后,通过`sizeof`运算符示例展示了如何获取变量的字节大小。
|
2月前
|
C语言
C语言程序设计核心详解 第二章:数据与数据类型 4种常量详解 常见表达式详解
本文详细介绍了C语言中的数据与数据类型,包括常量、变量、表达式和函数等内容。常量分为整型、实型、字符型和字符串常量,其中整型常量有十进制、八进制和十六进制三种形式;实型常量包括小数和指数形式;字符型常量涵盖常规字符、转义字符及八进制、十六进制形式;字符串常量由双引号括起。变量遵循先定义后使用的规则,并需遵守命名规范。函数分为标准函数和自定义函数,如`sqrt()`和`abs()`。表达式涉及算术、赋值、自增自减和逗号运算符等,需注意运算符的优先级和结合性。文章还介绍了强制类型转换及隐式转换的概念。