表达式求值的相关语法知识(C语言)

目录

整型提升

整型提升的意义

整型提升规则

整型提升实例

算术转换

赋值转换

操作符的属性

C语言的语法并不能保证表达式的执行路径唯一!!!

问题表达式


整型提升

        C的整型算术运算总是至少以缺省整型类型的精度来进行的。为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升。

整型提升的意义

        表达式的整型运算要在CPU的相应运算器件内执行,CPU内整型运算器(ALU)的操作数的字节长度一般就是int的字节长度,同时也是CPU的通用寄存器的长度。

        因此,即使两个char类型的相加,在CPU执行时实际上也要先转换为CPU内整型操作数的标准长度。

        通用CPU(general-purpose CPU)是难以直接实现两个8比特字节直接相加运算(虽然机器指令中可能有这种字节相加指令)。所以,表达式中各种长度可能小于int长度的整型值,都必须先转换为int或unsigned int,然后才能送入CPU去执行运算。

整型提升规则

        对于有符号的小于 int 的整型数据,在进行整型提升时根据符号位来提升

        //负数的整形提升

        char c1 = -1;
        变量c1的二进制位(补码)中只有8个比特位:
        11111111
        因为 c1 为有符号的 char
        所以整形提升的时候,高位补充符号位,即为1
        提升之后的结果是:
        111111111111111111111111111111111

        

        //正数的整形提升

        char c2 = 1;
        变量c2的二进制位(补码)中只有8个比特位:
        00000001
        因为 c2 为有符号的 char
        所以整形提升的时候,高位补充符号位,即为0
        提升之后的结果是:
        00000000000000000000000000000001

        无符号的小于 int 的整型数据没有符号位,在进行整型提升时高位补0

        unsigned  char c1 = -1;
        变量c1的二进制位(补码)中只有8个比特位:
        11111111
        因为 c1 为无符号的 char
        所以整形提升的时候,高位补0
        提升之后的结果是:
        00000000000000000000000011111111

        

        unsigned char c2 = 1;
        变量c2的二进制位(补码)中只有8个比特位:
        00000001
        因为 c2 为无符号的 char
        所以整形提升的时候,高位补0
        提升之后的结果是:
        00000000000000000000000000000001

整型提升实例

实例一:

        实例1中的a,b要进行整型提升,但是c不需要整型提升

        a,b整型提升之后,变成了负数,所以表达式 a==0xb6 , b==0xb600 的结果是假,但是c不发生整型提升,则表达式 c==0xb6000000 的结果是真.所以打印结果为 c

实例二:

        实例2中的c只要参与表达式运算,就会发生整型提升,表达式 +c ,就会发生提升,所以 sizeof(+c) 是4个字节.表达式 -c 也会发生整型提升,所以 sizeof(-c) 是4个字节,但是 sizeof(c) ,就是1个字节.

实例三:

算术转换

        如果某个操作符的各个操作数属于不同的类型,那么除非其中一个操作数的转换为另一个操作数的类型,否则操作就无法进行。下面的层次体系称为寻常算术转换。

        如果某个操作数的类型在上面这个列表中排名较低,那么首先要转换为另外一个操作数的类型后执行运算。(可能会导致精度丢失,因此算术转换要合理且慎重)

实例一:

赋值转换

        赋值时,=右边的值会转换成左边变量的数据类型(构建临时变量,右边的值本身不变化)再赋值(可能会导致精度丢失).

实例一:

操作符的属性

        复杂表达式的求值还有三个影响的因素。
        1. 操作符的优先级
        2. 操作符的结合性
        3. 是否控制求值顺序
        两个相邻的操作符先执行哪个取决于他们的优先级。如果两者的优先级相同,则取决于他们的结合性。

        下表优先级从高到低:

优先级实例一:

结合性实例一:

控制求值顺序实例一(&&和||):

C语言的语法并不能保证表达式的执行路径唯一!!!

       由于C语言的语法规则只争对相邻的操作符,因此并不能保证表达式的执行路径唯一!!!

        实例如下:

问题表达式

实例一:

实例二:

实例三:

实例四:

作者在不同编译器中测试结果:非法表达式程序的结果
—128Tandy 6000 Xenix 3.2
—95Think C 5.02(Macintosh)
—86IBM PowerPC AIX 3.2.5
—85Sun Sparc cc(K&C编译器)
—63 gcc,HP_UX 9.0,Power C 2.0.0
Sun Sparc acc(K&C编译器)
21Turbo C/C++ 4.5
22FreeBSD 2.1 R
30Dec Alpha OSF1 2.0
36Dec VAX/VMS
42 Microsoft C 5.1

        总结:我们写出的表达式如果不能通过操作符的属性确定唯一的计算路径,那这个表达式就是存在问题的。在实践中我们应避免这种问题。

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

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

相关文章

Cesium 坐标转换

屏幕坐标、固定坐标、惯性坐标转换 Cesium版本1.118.2 //屏幕坐标转固定坐标 let position viewer.scene.pickPosition(movement.endPosition) //当前时间 const now viewer.clock.currentTime //固定系坐标 const pointInFixed position //转换阵 const fixedToIcrf C…

Linux kernel启动initramfs

制作文件系统 用busybox制作文件系统,过程忽略。制作完成后进入rootfs目录,执行: ln -s /bin/busybox init 配置内核 打开配置菜单,这里只需要配置两个配置项: General setup–>选择 Initial RAM filesystem and…

昇思25天学习打卡营第8天 | 保存与加载 使用静态图加速

保存与加载 在训练网络模型的过程中,实际上我们希望保存中间和最后的结果,用于微调(fine-tune)和后续的模型推理与部署,下面是介绍如何保存与加载模型。 先定义一个模型用: import numpy as np import m…

每个 Node.js 开发人员都应该知道的13个库(上)

1. Sequelize Sequelize是一个基于promise的Node.js对象关系映射器(ORM),它使开发人员更容易使用关系数据库。 支持PostgreSQL,MySQL,MariaDB,SQLite和更多数据库。 Sequelize使用JavaScript对象对数据库…

@PathVariable注解的使用及源码解析

前言 PathVariable 注解是我们进行JavaEE开发,最常见的几个注解之一,这篇博文我们以案例和源码相结合,帮助大家更好的了解PathVariable 注解 使用案例 1.获取 URL 上的值 RequestMapping("/id/{id}") public Object getId(Path…

【5000论文】基于大数据的电影数据可视化系统设计与实现论文分享

论文框架免费分享,代码收费,有需要可以联系我~ 基于大数据的电影数据可视化系统设计与实现 摘要:本论文深入探讨了基于大数据的电影数据可视化系统的设计与实现。在电影产业数字化进程加速、数据量急剧增长的背景下,…

如何学习Vue?

要学习Vue,可以按照以下步骤: 熟悉HTML、CSS和JavaScript的基础知识。Vue是一个JavaScript框架,所以了解JavaScript的基础知识是必要的。 了解Vue的基本概念和语法。可以通过阅读Vue的官方文档来学习Vue的相关知识。Vue的官方文档提供了详细…

【Python机器学习】单变量非线性变换

添加特征的平方或立方可以改进线性回归模型,其他变换通常也对变换某些特征有用,特别是应用数学函数,比如log、exp、sin等。虽然基于树的模型只关注特征的顺序,但是线性模型和神经网络依赖于每个特征的尺度和分布。如果在特征和目标…

JAVA实现PDF转HTML文档

本文是将PDF文档转PNG图片,然后进行图片拼接&#xff0c;拼接后的图片转为base64字符串&#xff0c;然后拼接html文档&#xff08;再写入html文件&#xff09;。 引入maven依赖 <!-- https://mvnrepository.com/artifact/org.apache.pdfbox/pdfbox --><dependency&g…

首次线下联合亮相!灵途科技携手AEye、ATI亮相2024 EAC 易贸汽车产业大会

6月22日&#xff0c;2024 EAC 易贸汽车产业大会在苏州国际博览中心圆满落幕&#xff0c;泛自动驾驶领域光电感知专家灵途科技携手自适应高性能激光雷达解决方案全球领导者AEye公司&#xff08;NASDAQ:LIDR&#xff09;及光电器件规模化量产巨头Accelight Technologies&#xff…

【单片机开发--使用循环缓冲区接受can数据帧,读写数据到内存】

双指针读写数组需要考虑的问题 使用双指针循环读写数值可能会遇到的问题&#xff1a; 初始值&#xff0c;边界值问题。 topbottom0 top往后移使用top ( top moveSize ) % buffSize bottom往后移使用bottom ( bottom moveSize ) % buffSize。 top指向的位置没有数据&…

第十七站:Java钛金——高性能计算的坚固基石

Java NIO&#xff1a;非阻塞式I/O的革命 Java NIO&#xff0c;全称为New Input/Output&#xff0c;是Java平台对传统阻塞式I/O模型的一次重大革新。NIO引入了Channel和Buffer的概念&#xff0c;允许程序在不等待I/O操作完成的情况下继续执行其他任务&#xff0c;从而极大地提升…

量块检定校准中,如何调整好校准所需的温度条件?

量块是计量中常用的标准件&#xff0c;在日常使用中可以作为各类仪器校准中的辅助工具&#xff0c;而量块自身如果进行检定校准&#xff0c;其校准过程中温度的条件就是需要多次进行调控&#xff0c;因为量块的校准需要在恒温环境下进行&#xff0c;量块的精确度和实验室环境的…

触摸屏与罗克韦尔AB PLC之间 ModbusTCP/IP无线以太网通讯实例

在实际系统中&#xff0c;同一个车间里分布多台PLC&#xff0c;通过触摸屏人机界面集中控制。通常所有设备距离在几十米到上百米不等。在有通讯需求的时候&#xff0c;如果布线的话&#xff0c;工程量较大耽误工期&#xff0c;这种情况下比较适合采用无线通信方式。本方案以组态…

虚拟机查看端口占用情况

ps -aux | grep 8888 ps aux | grep 8888命令用于查找并显示所有包含字符串"8888"的进程。具体来说&#xff1a; ps命令用于列出当前系统上的进程。 aux选项是常见的用法&#xff0c;它显示所有用户的所有进程&#xff0c;并显示详细的进程信息。 | grep 8888将ps命令…

JAVA学习-练习试用Java实现“二叉树的中序遍历”

问题&#xff1a; 给定一个二叉树的根节点 root &#xff0c;返回它的 中序 遍历。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,3,2] 示例 2&#xff1a; 输入&#xff1a;root [] 输出&#xff1a;[] 示例 3&#xff1a; 输入&…

操作系统面试篇一

很多读者抱怨计算操作系统的知识点比较繁杂&#xff0c;自己也没有多少耐心去看&#xff0c;但是面试的时候又经常会遇到。所以&#xff0c;我带着我整理好的操作系统的常见问题来啦&#xff01;这篇文章总结了一些我觉得比较重要的操作系统相关的问题比如 用户态和内核态、系统…

C++一文讲透thread中的detach和join的差别

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、thread详解二、线程何时运行三、线程启动方式1.join2.detach 总结 前言 无论哪种语言线程在绝大多数项目中都是会用到的&#xff0c;C也一样&#xff0c;C…

昇思25天学习打卡营第9天 | 静态图加速

内容介绍&#xff1a; AI编译框架分为两种运行模式&#xff0c;分别是动态图模式以及静态图模式。MindSpore默认情况下是以动态图模式运行&#xff0c;但也支持手工切换为静态图模式。两种运行模式的详细介绍如下&#xff1a; 动态图模式&#xff1a; 动态图的特点是计算图的…

【Docker项目实战篇】Docker部署PDF多功能工具Stirling-PDF

【Docker项目实战篇】Docker部署PDF多功能工具Stirling-PDF 前言一、Stirling-PDF介绍1.1 Stirling-PDF简介1.2 Stirling-PDF功能 二、本次实践规划2.1 本地环境规划2.2 本次实践介绍 三、本地环境检查3.1 检查Docker服务状态3.2 检查Docker版本3.3 检查docker compose 版本 四…