当前位置: 首页 > news >正文

表达式求值的相关语法知识(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

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

相关文章:

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

目录 整型提升 整型提升的意义 整型提升规则 整型提升实例 算术转换 赋值转换 操作符的属性 C语言的语法并不能保证表达式的执行路径唯一!!! 问题表达式 整型提升 C的整型算术运算总是至少以缺省整型类型的精度来进行的。为了获得这…...

开发中遇到Electron自定义窗口的问题

开发中遇到Electron自定义窗口的问题 使用VUE3 Electron 开发一个音乐软件,自定义导航栏的放大、缩小和关闭。 其中使用ipcRenderer进行联系Electron,进行放大、缩小和关闭操作。 遇到问题 遇到__dirname is not defined in ES module scope //在V…...

c# sqlite使用

安装包 使用 const string strconn "Data Sourcedata.db"; using (SQLiteConnection conn new SQLiteConnection(strconn)) {conn.Open();var cmd conn.CreateCommand();cmd.CommandText "select 1";var obj cmd.ExecuteScalar();MessageBox.Show(ob…...

39、Flink 的窗口剔除器(Evictors)详解

Evictors Flink 的窗口模型允许在 WindowAssigner 和 Trigger 之外指定可选的 Evictor,通过 evictor(...) 方法传入 Evictor。 Evictor 可以在 trigger 触发后、调用窗口函数之前或之后从窗口中删除元素, Evictor 接口提供了两个方法实现此功能&#x…...

Flutter 中的 DefaultTabController 小部件:全面指南

Flutter 中的 DefaultTabController 小部件:全面指南 在Flutter中,DefaultTabController是一个用于管理Tab控制器的widget,它允许你控制Tab视图的初始索引和动态更新。这个组件在实现具有可滚动标签页的界面时非常有用,例如在设置…...

C++技能进阶指南——多态语法剖析

前言:多态是面向对象的三大特性之一。顾名思义, 多态就是多种状态。 那么是什么的多种状态呢? 这里的可能有很多。比如我们去买火车票, 有普通票, 学生票; 又比如我们去旅游, 有儿童票&#xff…...

Linux内存管理--系列文章肆

一、引子 上篇文章介绍了目标文件,也就是讲到编译过程中的汇编这个阶段。本篇要讲目标文件怎么变成一个可执行文件的,介绍编译过程中的链接。 链接主要分为两种,静态链接和动态链接。它们本质上的区别,是在程序的编译和运行过程中…...

kali下载zsteg和stegpy

1.kali下载zsteg 从 GitHub 上克隆zsteg到kali git clone https://github.com/zed-0xff/zsteg 切换目录 cd zsteg 用于安装名为 zsteg 的 Ruby Gem 包 gem install zsteg 2.kali下载stegpy 下载网站内的stegpy-master压缩包GitCode - 开发者的代码家园 并拉到kali中 切换到s…...

前端面试题日常练-day34 【面试题】

题目 希望这些选择题能够帮助您进行前端面试的准备,答案在文末。 1. jQuery中,以下哪个选项用于筛选出第一个匹配的元素? a) first() b) get(0) c) eq(0) d) find(":first") 2. 在jQuery中,以下哪个选项用于在元素上…...

网站笔记:huggingface model memory calculator

Model Memory Utility - a Hugging Face Space by hf-accelerate 这个工具可以计算在 Hugging Face Hub上托管的大型模型训练和执行推理时所需的vRAM内存量。模型所需的最低推荐vRAM内存量表示为“最大层”的大小,模型的训练大约是其大小的4倍(针对Adam…...

SpringBoot2.0.x旧版集成Swagger UI报错Unable to infer base url...解决办法

一、问题描述 1.1项目背景 SpringBoot2.0.9的旧版项目维护开发,集成Swagger-ui2.9.2无法访问的问题。不用想啊,这种老项目是各种过滤器拦截器的配置,访问不到,肯定是它们在作妖。懂得都懂啊,这里交给大家一个排错的办…...

软件项目详细设计说明书实际项目参考(word原件下载及全套软件资料包)

系统详细设计说明书案例(直接套用) 1.系统总体设计 2.性能设计 3.系统功能模块详细设计 4.数据库设计 5.接口设计 6.系统出错处理设计 7.系统处理规定 软件开发全文档下载(下面链接或者本文末个人名片直接获取):软件开发全套资料-…...

电脑文件qt5core.dll如何修复?如何快速的解决qt5core.dll丢失问题

软件应用程序依赖于各种复杂的文件系统以保证其顺畅运行。这些文件中,动态链接库(Dynamic Link Library,简称DLL)是Windows操作系统中实现多种功能的关键组件之一。然而,DLL文件出现问题是Windows用户可能面临的常见挑…...

USART串口通信(stm32)

一、串口通信 通信的目的:将一个设备的数据传送到另一个设备,扩展硬件系统 通信协议:制定通信的规则,通信双方按照协议规则进行数据收发 STM32F103C8T6 USART资源: USART1、 USART2、 USART3 自带波特率发生器&…...

快速分析变量间关系(Boruta+SHAP+RCS)的 APP(streamlit)

快速分析变量间关系(BorutaSHAPRCS)的 APP(streamlit) 以下情况下,你需要这个快速分析的APP: 正式分析之前的预分析,有助于确定分析的方向和重点变量;收集变量过程中,监测收集的变量…...

解决docker中container运行闪退终止的问题

在运行bindmount-test时,点击完运行按钮后闪退结束运行。 第一步查看log日志: 2024-05-18 23:46:18 Error: Cannot find module /app/nodemon 2024-05-18 23:46:18 at Function.Module._resolveFilename (internal/modules/cjs/loader.js:668:15) …...

Redis 性能管理

一、Redis 性能管理 #查看Redis内存使用 172.168.1.11:6379> info memory 1. 内存碎片率 操作系统分配的内存值 used_memory_rss 除以 Redis 使用的内存总量值 used_memory 计算得出。内存值 used_memory_rss 表示该进程所占物理内存的大小,即为操作系统分配给…...

节水“云”科普丨北京昌平VR节水云展馆精彩上线

2024年5月15日上午,由北京昌平区水务局主办的“推进城市节水,建设美丽昌平——2024年全国城市节约用水宣传周暨‘坚持节水优先 树立节水标杆’昌平节水在行动主题实践活动”隆重举办,活动期间,昌平区水务局应用VR虚拟现实技术创新…...

linux的系统调用open, read函数(文件编程)使用demo

1.引言 为了学习linux系统下的app开发&#xff0c;记载了学习文件编程的笔记 2.open函数 功能 打开一个文件 头文件 #include<sys/stat.h> #include<fcntl.h> 函数形式 int open(const char* pathname, int flags, mode_t mode); 返回值 如果调用成功&#xff0c…...

C语言基础——循环(2)+关机程序

欢迎点赞支持 个人主页&#xff1a;励志不掉头发的内向程序员&#xff1b; 专栏主页&#xff1a;C语言基础&#xff1b; 文章目录 目录 前言 一、for循环的补充 二、循环的嵌套 1、嵌套的介绍 1.1 练习&#xff1a; 题目解析&#xff1a; 优化&#xff1a; 三、goto语句 1、go…...

py每日spider案例之网pan搜索接口

import requests import jsonheaders = {"accept": "application/json","accept-language": "zh-CN,zh;q=0.9","cache-control": "no-cache","content-type":...

OpenEMS终极指南:三步构建你的智能能源管理系统

OpenEMS终极指南&#xff1a;三步构建你的智能能源管理系统 【免费下载链接】openems OpenEMS - Open Source Energy Management System 项目地址: https://gitcode.com/gh_mirrors/op/openems 还在为高额电费账单发愁吗&#xff1f;是否羡慕别人家的太阳能系统能智能调…...

恒模约束波形设计(Constant Modulus Waveform Design)第2章 MIMO雷达波形设计基础

目录 2.1 MIMO雷达系统模型 2.1.1 发射-接收信号模型与阵列几何配置 2.1.2 信号依赖干扰建模 2.1.3 扩展目标与点目标检测模型 2.2 波形设计目标函数 2.2.1 波束赋形设计准则 2.2.2 输出SINR最大化框架 2.2.3 CRLB最小化方法 2.3 硬件约束与工程实现 2.3.1 高功率放大…...

技术揭秘:SMUDebugTool如何实现AMD Ryzen处理器的深度硬件调试

技术揭秘&#xff1a;SMUDebugTool如何实现AMD Ryzen处理器的深度硬件调试 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: ht…...

EspDn32Mqtt:ESP32/ESP8266轻量级MQTT客户端封装库

1. EspDn32Mqtt 库深度解析&#xff1a;面向 ESP8266/ESP32 的轻量级 MQTT 客户端封装实践1.1 库定位与工程价值EspDn32Mqtt 是一个专为 ESP8266 和 ESP32 平台设计的轻量级 MQTT 客户端封装库。其核心目标并非替代PubSubClient或 ESP-IDF 原生mqtt_client&#xff0c;而是在保…...

Ubuntu服务器生产环境部署Pixel Script Temple全记录

Ubuntu服务器生产环境部署Pixel Script Temple全记录 1. 准备工作与环境检查 在开始部署之前&#xff0c;我们需要确保服务器环境满足基本要求。首先确认你的Ubuntu服务器版本为20.04 LTS或22.04 LTS&#xff0c;这两个版本都提供长期支持&#xff0c;适合生产环境使用。 运…...

gte-base-zh模型Java集成开发指南:SpringBoot构建语义搜索服务

gte-base-zh模型Java集成开发指南&#xff1a;SpringBoot构建语义搜索服务 你是不是也遇到过这样的问题&#xff1f;公司内部有海量的文档、产品说明或者用户反馈&#xff0c;想快速找到相关内容&#xff0c;用关键词搜索总是不准&#xff0c;要么搜不全&#xff0c;要么搜出一…...

Z-Image-Turbo-辉夜巫女实战教程:GPU算力弹性伸缩——按需加载LoRA模型

Z-Image-Turbo-辉夜巫女实战教程&#xff1a;GPU算力弹性伸缩——按需加载LoRA模型 1. 快速了解Z-Image-Turbo-辉夜巫女 Z-Image-Turbo-辉夜巫女是基于Z-Image-Turbo模型的LoRA版本&#xff0c;专门优化用于生成辉夜巫女风格图片的AI模型。这个模型通过Xinference框架部署&am…...

「码动四季·开源同行」go实战案例:如何使用 Prometheus 和 Grafana 监控预警服务集群?

监控和预警平台是互联网公司较为重要的后端架构组成之一&#xff0c;是整个运维乃至整个产品生命周期中最重要的一环&#xff0c;它能够事前及时预警发现故障&#xff0c;事后提供详实的数据用于追查定位问题。Prometheus和Grafana 相结合是开源服务监控和预警平台的主流方案之…...

OpenClaw技能扩展指南:为Qwen3-4B-Thinking添加公众号发布模块

OpenClaw技能扩展指南&#xff1a;为Qwen3-4B-Thinking添加公众号发布模块 1. 为什么需要公众号发布技能 上周我尝试用OpenClaw自动整理技术文档时&#xff0c;突然想到个痛点&#xff1a;每次写完文章都要手动复制到公众号后台&#xff0c;调整格式、上传封面、设置摘要&…...