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

news2024/10/6 10:33:02

计算含多种运算符的表达式

  • 引入
  • 运算符的优先级
  • 算术表达式的运算规则
  • 引例
  • 例题

引入

诸如下面这些表达式,它的计算过程,计算顺序是怎样的?计算结果为多少?
今天我们就一起来解决一下这个问题吧!
在这里插入图片描述

运算符的优先级

解决这个问题,首先我们必须要了解清楚各种运算符的优先级。
首先,可以简单记,!!>算术运算符>关系运算符>&&>||>赋值运算符
再详细一点记的话,可以根据下面的口诀来记忆。

括号成员第一; //括号运算符[](),成员运算符. ->
全体单目第二;//++ ,–,+(正),-(负),指针运算符*、&
乘除余三,加减四// 余即%取余运算符
位移五,关系六//位移运算符<< >>,关系运算符>,<,≥,≤
等于(与)不等排第七// == 和! !=
位与异或和位或,三分天下,八九十//位与 &第八,异或^第九,位或|第十
逻辑或跟与,十二和十一//逻辑 或||十二,逻辑与&&十一
条件高于赋值//三目运算符优先级排到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。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/633281.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

6.数据结构期末复习之查找和排序1

概念 静态查找: 无插入和删除 动态查找: 边插入删除边查找静态和动态查找的实现方式 1.线性表: 静态查 2.树表(二叉排序树)动态查 3.散列表 静态动态都可以查找: 集合中查找满足条件的数据关键码 1.主关键码:可以表标识数据唯一性 2.次关键码: 不能标识查找效率: 比较次数决定的…

八、进程程序替换

文章目录 一、进程程序替换(一)概念(二)为什么程序替换(三)程序替换的原理(四)如何进行程序替换1. execl2. 引入进程创建——子进程执行程序替换,会不会影响父进程呢? &…

PDF 内容替换器软件工具 PDF Replacer Pro Crack

PDF 内容替换器软件工具 批量查找和替换 PDF 中的指定文本 PDF Replacer 是一款 Windows 软件程序,可在 PDF 文件中查找指定的单词或短语文本并替换为新文本,并保持 PDF 布局不变。 Windows 7/Win 8/Win 10 或更高版本(32/64 位) …

devart ADO.NET Data Providers 2023

ADO.NET Data Providers 2023 dotConnect 开发与数据相关的 .NET 应用程序的终极解决方案,具有 ORM 支持的快速灵活综合功能丰富的 ADO.NET 提供程序 ADO.NET 数据提供者 高性能 ADO.NET 数据提供程序 dotConnect 是一个增强的数据连接解决方​​案,它建立在 ADO.N…

为什么齐次线性方程组有非零解的充要条件是D=0

下面是对这两个定理的解释: 定理1:如果是齐次线性方程组(方程个数未知量个数),且系数行列式D不等于0,则只有0解; 定理2:若齐次线性方程组(方程个数未知量个数&#xff…

C语言---形参所导致的段错误

前言 今天刷B站&#xff0c;无意之间看到一个宣称90%人都会错的嵌入式面试题。感兴趣就看了一下。卡了十多分钟才想明白&#xff0c;只是一个小知识点&#xff0c;但还是分享一下。 题目 #include <stdio.h> #include <stdlib.h> #include <string.h>void g…

如何将bootloader和APP程序一次性烧录到单片机中

在做单片机的IAP升级时&#xff0c;通常需要两个程序&#xff0c;一个bootloader程序&#xff0c;一个app程序。首先将bootloader程序烧写到单片机中&#xff0c;然后通过串口将app程序写入到单片机内容&#xff0c;在平时学习和测试的时候这种方法没啥问题&#xff0c;但是如果…

K8S 生态周报| Ingress-NGINX v1.8 发布,升级前请先检查

“ 「K8S 生态周报」内容主要包含我所接触到的 K8S 生态相关的每周值得推荐的一些信息。欢迎订阅知乎专栏「k8s生态」[1]。 ” 大家好&#xff0c;我是张晋涛。 很抱歉&#xff0c;最近一段时间真的太忙了&#xff0c;写文章都断断续续的。主要在使用 Langchain 搭配 GPT-4 开发…

Nginx扩展篇之Location语法规则

1 Location语法规则 1.1 Location规则 语法规则&#xff1a; location [||*|^~] /uri/ {… } 首先匹配 &#xff0c;其次匹配^~,其次是按文件中顺序的正则匹配&#xff0c;最后是交给 /通用匹配。当有匹配成功时候&#xff0c;停止匹配&#xff0c;按当前匹配规则处理请求。 …

Nginx部署多个前端项目【Linux/Windows-详细操作】

需求:项目上线需要将前端的前台和后台部署在服务器上提供用户进行使用&#xff0c;部署在不同的服务器直接在服务器安装nginx即可。但是在内网安装还是有点麻烦&#xff0c;因为需要联网&#xff0c;如果是内网可以参考Linux安装Nginx并部署前端项目【内/外网-保姆级教程】_MXi…

将数组s中的每个元素的内容在原来的位置上重复n次numpy.char.multiply(s,n)

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 将数组s中的每个元素的内容 在原来的位置上重复n次 numpy.char.multiply(s,n) 下列代码最后输出的结果是&#xff1f; import numpy as np x np.array([I, have, 2, cats]) print(&qu…

如何看待ICML2023的录用结果?

链接&#xff1a;https://www.zhihu.com/question/597314456 编辑&#xff1a;深度学习与计算机视觉 声明&#xff1a;仅做学术分享&#xff0c;侵删 作者&#xff1a;知乎用户 https://www.zhihu.com/question/597314456/answer/3000946712 不是因为文章被拒&#xff0c;而是因…

一文读懂 Mysql MVCC

&#x1f495;&#x1f495; 推荐&#xff1a;体系化学习Java&#xff08;Java面试专题&#xff09; 文章目录 1、什么是 MVCC2、什么是当前读、快照读3、MVCC 具体解决什么问题4、MVCC 的实现原理4.1、4个隐式字段4.2、undo 日志4.3、Read View 5、使用 MVCC 时&#xff0c;需…

CSS灯光效果,背景黑金效果

先看效果 再看代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>灯光效果</title><link href"https://fonts.googleapis.com/css2?familyCinzel:wght700&amp;dis…

MyBatis 动态sql移除最后的逗号 mybatis trim标签用法 Mybatis 去掉最后的逗号符号

MyBatis 动态sql移除最后的逗号 mybatis trim标签用法 Mybatis 去掉最后的逗号符号 一、概述 在使用MyBatis 写动态sql时&#xff0c;经常会遇到要移除最后多余的 符号 &#xff0c;and &#xff0c; or之类的关键字 &#xff1b; 还有可能需要移除的前缀 where &#xff0c; s…

续-初识JAVaScript---(2)

初识JavaScript ———&#xff08;2&#xff09;&#xff01;&#xff01;&#xff01; 一、关于JavaScript中的数据类型 虽然在JS中的变量在声明的时候不需要指定数据类型&#xff0c;但是在赋值的时候&#xff0c;每一个数据还是有类型的&#xff0c;所以还是需要学习JS中…

c语言第一课---------它来了,它来了,带着薪资走来了

作者前言: 这是我的gitee仓库:https://gitee.com/qin-laoda/python-exercises 有兴趣的小可爱们可以点进去看看,里面有我写的代码我们一起来借鉴 由于本人的自我介绍已经自我介绍过了,在我的的第一篇博客里,有兴趣的小可爱可以去看看, 作者的建议 下面我们简单介绍学好C语言…

【Python】Python进阶系列教程-- Python3 JSON 数据解析(九)

文章目录 前言Python 编码为 JSON 类型转换对应表&#xff1a;JSON 解码为 Python 类型转换对应表&#xff1a;json.dumps 与 json.loads 实例 前言 往期回顾&#xff1a; Python进阶系列教程-- Python3 正则表达式&#xff08;一&#xff09;Python进阶系列教程-- Python3 C…

LLVM 标准 C++ 排序算法

Nature 官网发表《深度强化学习发现更快的排序算法》。 排序或散列这样的基本算法在任何一天都会被使用数万亿次1。随着计算需求的增长&#xff0c;这些算法的性能变得越来越重要 算法已经集成到 LLVM 标准 C排序库中&#xff0c;使用强化学习的新算法替换掉了原有的 LLVM libc…

STM32CubeMX | 44 - 使用GPIO点亮单总线RGBLED

一、单总线RGBLED 1. 硬件连接 在DragonFly上有四个全彩灯相连: 其中RGB_LED连接到STM32的PB9引脚。 2. 单总线通信协议 单总线通信协议中,表示bit0和bit1的码型如下: 时序值如下: 驱动一个单总线RGBLED只需要传输24bit颜色数据即可(MSB,高位优先),格式如下(注意…