C语言:表达式求值

引言:在笔试中,有一类的题目,题目给出代码,要求分析得出输出结果。这类题目更加考察我们对于运算顺序和运算类型转换的理解。文章介绍了隐式类型转换和操作符注意点,希望增加读者对于表达式求值的理解。

1.隐式类型转换

        1.1.整形提升:

           C语言中运算总是至少以缺省(默认)整型类型的精度来进行的,意思就是,再做算术运算的时候,如果是char,short类型这样精度(所占字节数)的数据,小于int类型数据的精度,会在计算之前被转换为普通整形(有符号),参与运算。这样做的根本原因是CPU运算器无法处理8比特数据直接运算。注意这里的运算包括算数运算,比较运算,赋值运算等等。

        1.2.赋值的规则:   

           当高精度向低精度赋值时,多余部分直接舍去(截断)

           比如char a=-1;-1为整型,所以其补码有32个比特位:

           原码:10000000 00000000 00000001,

           反码:11111111 11111111 11111110

           补码:11111111 11111111 11111111

         而char类型只有1字节,8比特位,所以直接进行截断:11111111,截取最后八位存储在a中。

        1.3.提升的规则:

  • short,char提升为int:高位直接补充符号位(也就是补充8个比特位中的首位)补充到32位,例如char a=-1,a中储存的是11111111,在运算的时候,补充为11111111 11111111 11111111。
  • unsigned char/short提升为int:直接补充0

           如下列代码:在注释中演示了提升,截取,打印。

char a = 1, b = 127;//截取之后内存中a的补码:01111111
//截取之后内存中b的补码:00000001//提升之后a的补码:00000000 00000000 01111111
//提升之后b的补码:00000000 00000000 00000001//相加之后 的结果: 00000000 00000000 10000000char c = a + b;//截取之后内存中c的补码:10000000//打印时,提升之后的补码:11111111 11111111 10000000
//   求得提升之后的原码:10000000 00000000 10000000printf("%d", c);
//打印结果:-128

       1.4.算数转换:

          如果运算时,出现精度更高的,转化为精度最高的数据类型之后,再进行运算。比如下面代码中,计算a-b,那么需要先将a提升为float类型之后,才进行下一步运算。

int a = 1;
float b = 3.15;//int 提升为 float :化整补0
b = a;
printf("%f\n", b); //1.000000//float 转化为 int :直接舍去小数部分
a = b;
printf("%d", a);  //1

2.操作符注意点:

    2.1操作符的优先级:两个相邻的操作符,谁会先执行。

    2.2操作符的结合性:相邻的操作符相同,执行方向是什么。

    2.3是否控制求值顺序:语句的执行顺序

具体优先级顺序参考优先级表:C语言运算符优先级(超详细)_>和+的。运算优先级-CSDN博客

对于结合性说明:比如a+b+c,相邻的两个操作符都是+,所以考虑结合性,+的结合性是从左至右,所以先算a+b,再算(a+b)+c。

对于求值顺序说明:在C语言中&&,||,逗号表达式具有求值顺序。比如a&&b,执行该语句先计算a,当a为0(假)的时候,b不会计算,a为1(真)时才会计算b的值; || 同理。对于逗号表达式,从左至右,依次执行,最后表达式是整个表达式的值。

注意:问题表达式:执行顺序不唯一的表达式。在实际使用时,要避免产生这样的表达式,不然会使得编译器凌乱。比如:a*1b+2c*3d+4e*5f,执行的顺序可以是:1,3,5,2,4;也可以是:1,3,2,5,4(编号代表运算符)这样做的影响是什么?顺序不唯一,可能每个表达式(a也可以代表表达式)之间有关联,这样顺序不唯一的操作下,可能致使结果不唯一。比如如下代码:每个编译器的结果都不一样。

int fun(void)
{static int count = 1;return ++count;
}
int main()
{int answer;answer = fun() - fun() * fun();printf("%d\n", answer);//输出多少?return 0;
}

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

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

相关文章

Java实现民宿预定管理系统 JAVA+Vue+SpringBoot+MySQL

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 用例设计2.2 功能设计2.2.1 租客角色2.2.2 房主角色2.2.3 系统管理员角色 三、系统展示四、核心代码4.1 查询民宿4.2 新增民宿4.3 新增民宿评价4.4 查询留言4.5 新增民宿订单 五、免责说明 一、摘要 1.1 项目介绍 基于…

Dev c++安装教程

要安装Dev C,请遵循以下步骤: 打开您的Web浏览器,然后访问SourceForge的Dev C下载页面:https://sourceforge.net/projects/orwelldevcpp/(点我) 在下载页面上,您将看到几个版本的Dev C可供选择…

计算指定路径下的可用空间大小

方法一、使用psutil库 import psutildef check_disk_space(path):usage psutil.disk_usage(path)## 1GB 1 * 1024 * 1024 * 1024字节if usage.free > 1 * 1024 * 1024 * 1024:return 1else:return 0disk_path "/home" result check_disk_space(disk_path) pr…

Android7.0-Fiddler证书问题

一、将Fiddler的证书导出到电脑,点击Tools -> Options -> HTTPS -> Actions -> Export Root Certificate to Desktop 二、下载Window版openssl, 点击这里打开页面,下拉到下面,选择最上面的64位EXE点击下载安装即可 安…

51单片机 跑马灯

#include <reg52.h>//毫秒级延时函数 void delay(int z) {int x,y;for(x z; x > 0; x--)for(y 114; y > 0 ; y--); }sbit LED1 P1^0x0; sbit LED2 P1^0x1; sbit LED3 P1^0x2; sbit LED4 P1^0x3; sbit LED5 P1^0x4; sbit LED6 P1^0x5; sbit LED7 P1^0x6; s…

Rust通用代码生成器莲花发布红莲尝鲜版二十一,前端代码生成物有巨大改进

Rust通用代码生成器莲花发布红莲尝鲜版二十一&#xff0c;前端代码生成物有巨大改进 Rust通用代码生成器莲花已发布红莲尝鲜版二十一&#xff0c;此版本采用了新的前端代码生成引擎&#xff1a;时空之门前端代码生成器6.2.0。此引擎支持Nodejs 21,Nodejs 18和Nodejs 14。消除了…

嵌入式软件工程师面试题——嵌入式专题 (五十七)

说明&#xff1a; 面试群&#xff0c;群号&#xff1a; 228447240面试题来源于网络书籍&#xff0c;公司题目以及博主原创或修改&#xff08;题目大部分来源于各种公司&#xff09;&#xff1b;文中很多题目&#xff0c;或许大家直接编译器写完&#xff0c;1分钟就出结果了。但…

Ansible自动化工具(1)

目录 ansible的特性&#xff1a;. 二.部署ansible 管理端安装 ansible&#xff1a; ansible 目录结构&#xff1a; 管理主机上配置主机清单&#xff1a; ​编辑 配置密钥对验证&#xff1a; ansible 命令行模块 &#xff1a; 1&#xff0e;command 模块 指定 ip 执行…

蓝桥杯-求阶乘-python

问题描述 满足N!的末尾恰好有K个0的最小的N是多少&#xff1f; 如果这样的N不存在输出一1。 思路解析 末尾的0是由10产生的&#xff0c;而10是由质数2和5产生的 在求阶乘的过程中&#xff0c;只要是偶数就会有2&#xff0c;而5相对2更少&#xff0c;所以对于10的数量我们可以…

P8647 [蓝桥杯 2017 省 AB] 分巧克力--2024蓝桥杯冲刺省一

知识点讲解&#xff1a;二分算法--模板及原理总结 思路&#xff1a;读完题发现答案的边长是具有二段性&#xff0c;单调性的。就是假如答案为ans&#xff0c;那么所有 <ans的值为【1&#xff0c;ans】都满足题意&#xff0c;那么我们就是寻找满足这个性质的最大值。 ans的…

MyBatis中#和$符的区别,sql注入问题,动态sql语句

MyBatis中#{}和${}的区别 #{}和${}都是MyBatis提供的sql参数替换。区别是&#xff1a;#{}是预编译处理&#xff0c;${}是字符串直接替换。#{}可以防止SQL注入&#xff0c;${}存在SQL注入的风险&#xff0c;例如 “ or 11”虽然存在SQL注入风险&#xff0c;但也有自己的适用场…

分享3款开源免费好用的Docker可视化管理工具安装部署教程

文章目录 1.前言2.Docker Desktop3.Portainer3.1 Portainer默认英文版本安装3.2 Portainer汉化版本安装3.3官方镜像说明3.3.1ssl访问3.3.2Nginx反代3.3.3Nginx反代设置子目录3.3.4docker-compose部署 3.4登录 4.DockerUI4.1简介4.2项目地址4.3部署启动命令4.4登录4.5首页 5.总结…

C语言数组与扫雷游戏实现(详解)

扫雷游戏的功能说明 使⽤控制台实现经典的扫雷游戏游戏可以通过菜单实现继续玩或者退出游戏扫雷的棋盘是9*9的格子默认随机布置10个雷可以排查雷 ◦ 如果位置不是雷,就显示周围有几个雷 ◦ 如果位置是雷,就炸死游戏结束 ◦ 把除10个雷之外的所有雷都找出来,排雷成功,游戏结…

【数据分享】1929-2023年全球站点的逐日平均风速数据(Shp\Excel\免费获取)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、能见度等指标&#xff0c;说到气象数据&#xff0c;最详细的气象数据是具体到气象监测站点的数据&#xff01; 有关气象指标的监测站点数据&#xff0c;之前我们分享过1929-2023年全球气象站…

探讨:线程循环与激活(C++11)

关于并发程序的交互&#xff0c;办法挺多&#xff0c;但是既要快速响应又要节省CPU的没什么太好的现成策略。我这里提个思路&#xff0c;大家探讨探讨。 分析 死循环&#xff0c;响应速度够快&#xff0c;但是浪费CPU&#xff0c;每个循环加上一个sleep(0)或者yield()&#xf…

我的QQ编程学习群

欢迎大家加入我的QQ编程学习群。 群号:950365002 群里面有许多的大学生大佬&#xff0c;有编程上的疑惑可以随时问&#xff0c;也可以聊一些休闲的东西。 热烈欢迎大家加入&#xff01;&#xff01; 上限:150人。

Linux联网安装MySQL Server

yum安装 以下代码复制粘贴到控制台即可 yum list | grep mysql-server #查看可以下载的MySQLyum install -y mysql-server #安装MySQLmysql_secure_installation #引导安装 引导安装实例如下 systemctl enable mysqld 设置开机自动启动 systemctl sta…

Powershell Install 一键部署Openssl+certificate证书创建

前言 Openssl 是一个方便的实用程序,用于创建自签名证书。您可以在所有操作系统(如 Windows、MAC 和 Linux 版本)上使用 OpenSSL。 Windows openssl 下载 前提条件 开启wmi,配置网卡,参考 自签名证书 创建我们自己的根 CA 证书和 CA 私钥(我们自己充当 CA)创建服务器…

代码随想录算法训练营|day28

第七章 回溯算法 93.复原IP地址78.子集90.子集II代码随想录文章详解 93.复原IP地址 ip地址有效需要满足&#xff1a;遍历完s&#xff0c;将其分为4段&#xff0c;每段数字有效性&#xff1a;范围在[0,255],且不含前导零 为避免重复取值&#xff0c;需要startIndex作为下次递归…

开源社区资源网站GitHub遭遇经济危机:GitHub员工警告当前模式不可持续,没有更多资金开源项目就有消亡的风险

在 State of Open Con 活动中&#xff0c;GitHub 的开源项目经理 Kara Sowles 警告称当前的开源资助方法“不可持续”。她指出&#xff0c;许多开源开发人员在没有报酬的情况下工作&#xff0c;这导致 58% 的开发人员考虑过停止参与开源项目&#xff0c;22% 的人已经退出。此外…