操作符详解(下) (C语言)

操作符详解下

  • 操作符的属性
    • 1.优先级
    • 2.结合级
  • 表达式求值
    • 1.整型提升
    • 2.如何进行整形提升呢?
    • 3.算术转换
    • 4.问题表达式解析

操作符的属性

C语言的操作符有2个重要的属性:优先级、结合性,这两个属性决定了表达式求值的计算顺序。

1.优先级

优先级指的是,如果⼀个表达式包含多个运算符,哪个运算符应该优先执行。各种运算符的优先级是不⼀样的。
比如 3 + 4 * 5,表达式 3 + 4 * 5 里面既有加法运算符( + ),又有乘法运算符( * )。由于乘法的优先级高于加法,所以会先计算 4 * 5 ,而不是先计算3+4。

2.结合级

如果两个运算符优先级相同,优先级没办法确定先计算哪个了,这时候就看结合性了,则根据运算符是左结合,还是右结合,决定执行顺序。大部分运算符是左结合(从左到右执行),少数运算符是右结合(从右到左执行),比如赋值运算符( = )。
比如 5 * 6 / 2, * 和 / 的优先级相同,它们都是左结合运算符,所以从左到右执行,先计算 5 * 6 ,再计算 / 2 。
运算符的优先级顺序很多,下面是部分运算符的优先级顺序(按照优先级从高到低排列)详细的可以参考:https://zh.cppreference.com/w/c/language/operator_precedence

表达式求值

1.整型提升

C语言中整型算术运算总是至少以缺省(默认)整型类型的精度来进行的。
为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升
下面展示一些 内联代码片

int main()
{
char a,b,c;
a=b+c;
}

就比如上面的代码,b和c的值被提升为普通整型,然后再执行加法运算。加法运算完成之后,结果将被截断,然后再存储于a中。
(表达式的整型运算要在CPU的相应运算器件内执行,CPU内整型运算器(ALU)的操作数的字节长度一般就是int的字节长度,同时也是CPU的通用寄存器的长度。因此,即使两个char类型的相加,在CPU执行时实际上也要先转换为CPU内整型操作数的标准长度。
通用CPU(general-purpose CPU)是难以直接实现两个8比特字节直接相加运算(虽然机器指令中可能有这种字节相加指令)。所以,表达式中各种长度可能小于int长度的整型值,都必须先转换为int或unsigned int,然后才能送入CPU去执行)

2.如何进行整形提升呢?

  1. 有符号整数提升是按照变量的数据类型的符号位来提升的
  2. 无符号整数提升,高位补0
    比如:在这里插入图片描述

3.算术转换

如果某个操作符的各个操作数属于不同的类型,那么除非其中⼀个操作数的转换为另⼀个操作数的类型,否则操作就无法进行。下面的层次体系称之为寻常算术转换。如果某个操作数的类型在上面这个列表中排名靠后,那么首先要转换为另外⼀个操作数的类型后执行运算。在这里插入图片描述

4.问题表达式解析

其实有时候我们会发现如果一个表达式太过复杂或者表达不清楚,虽然编译器会给出结果但是去不一定正确,并且有可能在不同的编译器上给出的结果是不一样的,所以这样的表达式是有问题的。
1.比如:c+ --c; 操作符的优先级只能决定减 – 的运算在 + 的运算的前面,但是我们并没有办法得知, + 操作符的左操作数的获取在右操作数之前还是之后求值,所以结果是不可预测的,是有歧义的。
2.在这里插入图片描述
在这里插入图片描述
很显然,像这样有歧义的表达式在不同的编译器中会有不同的结果,再者说这样的表达式在一些运算当中都是错误的是不可取的。所以即使有了操作符的优先级和结合性,我们写出的表达式依然有可能不能通过操作符的属性确定唯⼀的计算路径,那这个表达式就是存在潜在风险的,建议不要写出特别复杂的表达式。

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

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

相关文章

问题:第一次世界大战的起止时间是 #其他#学习方法#微信

问题:第一次世界大战的起止时间是 A.1913 ~1918 年 B.1913 ~1918 年 C.1914 ~1918 年 D.1914 ~1919 年 参考答案如图所示

RabbitMQ 进程内流控(Flow Control) 源码解析

1. 概述 1.1 为什么要流控? 流控主要是为了防止生产者生产消息速度过快,超过 Broker 可以处理的速度。这时需要暂时限制生产者的生产速度,让 Broker 的处理能够跟上生产速度。 Erlang进程之间不共享内存,每个进程都有自己的进程邮…

42.HOOK引擎核心代码

上一个内容:41.HOOK引擎设计原理 以 40.设计HOOK引擎的好处 它的代码为基础进行修改 主要做的是读写寄存器 效果图 添加一个类 htdHook.h文件中的实现 #pragma once class htdHook { public:htdHook(); };htdHook.cpp文件中的实现: #include "…

独辟蹊径:我是如何用Java自创一套工作流引擎的(下)

作者:后端小肥肠 创作不易,未经允许严禁转载。 姊妹篇:独辟蹊径:我是如何用Java自创一套工作流引擎的(上)_java工作流引擎-CSDN博客 1. 前言 在上一篇博客中,我们详细介绍了如何利用Java语言从…

LC437.路径总和Ⅲ、LC207.课程表

给定一个二叉树的根节点 root ,和一个整数 targetSum ,求该二叉树里节点值之和等于 targetSum 的 路径 的数目。 路径 不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点&am…

【每日刷题】Day77

【每日刷题】Day77 🥕个人主页:开敲🍉 🔥所属专栏:每日刷题🍍 🌼文章目录🌼 1. LCR 159. 库存管理 III - 力扣(LeetCode) 2. LCR 075. 数组的相对排序 - 力…

代理ip匿名原理

代理IP匿名的原理基于代理服务器的工作方式。当用户使用代理服务器访问互联网时,请求数据会先发送到代理服务器,然后由代理服务器再向目标服务器发送请求。在这个过程中,代理服务器会将用户真实IP地址替换成代理服务器的IP地址,从…

Linux——passwd文件,grep,cut

/etc/passwd文件含义 作用 - 记录用户账户信息:共分为7段,使用冒号分割 含义 - 文件内容意义:账户名:密码代号x:UID:GID:注释:家目录:SHELL - 第7列/sbin/nologin&#x…

c++(三)

1. STL 1.1. 迭代器 迭代器是访问容器中元素的通用方法。如果使用迭代器,不同的容器,访问元素的方法是相同的;迭代器支持的基本操作:赋值()、解引用(*)、比较(和!&…

隐私计算实训营第二期第11讲组件介绍与自定义开发

首先给大家推荐一个博主的笔记:隐语课程学习笔记11- 组件介绍与自定义开发-CSDN博客 官方文档:隐语开放标准介绍 | 开放标准 v1.0.dev240328 | 隐语 SecretFlow 01 隐语开放标准 隐语开放标准是为隐私保护应用设计的协议栈。 目前,隐语开…

mysql8.0-学习

文章目录 mysql8.0基础知识-学习安装mysql_8.0登录mysql8.0的体系结构与管理体系结构图连接mysqlmysql8.0的 “新姿势” mysql的日常管理用户安全权限练习查看用户的权限回收:revoke角色 mysql的多种连接方式socket显示系统中当前运行的所有线程 tcp/ip客户端工具基于SSL的安全…

Wp-scan一键扫描wordpress网页(KALI工具系列三十二)

目录 1、KALI LINUX 简介 2、Wp-scan工具简介 3、信息收集 3.1 目标IP(服务器) 3.2kali的IP 4、操作实例 4.1 基本扫描 4.2 扫描已知漏洞 4.3 扫描目标主题 4.4 列出用户 4.5 输出扫描文件 4.6 输出详细结果 5、总结 1、KALI LINUX 简介 Kali Linux 是一…

深入解析Tomcat:Java Web服务器(下)

深入解析Tomcat:Java Web服务器(下) 在上一篇文章中,我们介绍了Tomcat的基本概念、安装配置、以及基本使用方法。本文将继续探讨Tomcat的高级配置和性能调优。 5. 高级配置 5.1 配置文件详解 Tomcat的配置文件位于conf目录下&…

中北大学阿尔法编程之分治算法

整数划分问题 整数划分问题&#xff1a;将一个整数划分为若干个数相加 例子&#xff1a; 整数4 最大加数 4 44 134 1124 224 11114 一共五种划分方案 注意&#xff1a;134&#xff0c;314被认为是同一种划分方案 最后输出共几种划分方案 #include <stdio.h> …

Spring Boot中的模板引擎选择与配置

Spring Boot中的模板引擎选择与配置 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们来聊聊Spring Boot中的模板引擎选择与配置。模板引擎是生成动态网页…

MySQL root密码丢失处理

没有记住MySQL数据库root用户默认密码(为初始化安装mysql时默认生成) 1)修改/etc/my.cnf文件,在[mysqld]的段中加上一句:skip-grant-tables 重启mysql服务 [root@localhost ~]# service mysqld restart 2)以无密码方式进入mysql: [root@localhost ~]# /usr/local/my…

STM32CubeIDE使用标准库

以STM32F030为例使用标准库文件。 1、新建工程&#xff0c;选择需要使用配置的型号。 2、在工程选型中&#xff0c;选择新建空工程。 3、新建空工程 新建完成&#xff0c;系统只有main函数和启动文件.s有用。 4、启动文件 启动文件&#xff0c;同样是一个汇编文件&#xf…

【Matlab函数分析】imread从图形文件读取图像

&#x1f517; 运行环境&#xff1a;Matlab &#x1f6a9; 撰写作者&#xff1a;左手の明天 &#x1f947; 精选专栏&#xff1a;《python》 &#x1f525; 推荐专栏&#xff1a;《算法研究》 #### 防伪水印——左手の明天 #### &#x1f497; 大家好&#x1f917;&#x1f91…

雅思词汇及发音积累 2024.6.30

交通 tavel agency /ˈeɪdʒənsi/ 旅行社 book the ticket 订票 motel 汽车旅店 hostel 青年旅社 passport 护照 visa 签证 make a reservation 预订 confirm a reservation 确认预订 book a room/table 预订房间/饭桌 fare 票价 cancel ones reservation 取消预订 toll 通行…

【Python】 数据分析中的常见统计量:众数

那年夏天我和你躲在 这一大片宁静的海 直到后来我们都还在 对这个世界充满期待 今年冬天你已经不在 我的心空出了一块 很高兴遇见你 让我终究明白 回忆比真实精彩 &#x1f3b5; 王心凌《那年夏天宁静的海》 众数&#xff08;Mode&#xff09;是统计学中另…