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

C语言操作符(下)

上一篇文章传送门:操作符上
前言:上期我们介绍了C语言的操作符的使用方法,这期我们主要侧重讲当我们已经了解了操作符的基本知识后怎样样来看待运算路径的问题。

操作符

  • 一,优先级和结合性
    • 1,优先级
    • 2,结合性
  • 二,表达式求值
    • 1,整型提升
    • 2,算术转换
  • 三,表达式解析

一,优先级和结合性

上期我们介绍了很多操作符,包括像算数操作符,位操作符,移位操作符等。但还有一个问题就是我们虽然已经知道这些操作符怎么用但却不知道它们是按照什么顺序来运算的。这就要讲到操作符的2个属性——优先级和结合性,优先级和结合性就是用来解决这一问题的。

1,优先级

举个例子:3+4*5看到这段代码我们自然而然的就会想到先算乘除再加减,这是基于我们在数学上学过这个优先级才知道的。但C语言操作符有很多是我们没学过的怎么办呢?别担心,我有一张表可以让你一览无余:
在这里插入图片描述
这个表格能很清晰的告诉我们优先级的顺序,优先级很明显就是在一个表达式中谁优先级高谁就先运算。 但是这又会产生一个问题,就是如果表达式中所有操作符的优先级都相同那怎么看呢? 这就要看结合性了。

2,结合性

前面我们说了,当一个表达式中所有的操作符的优先级都一致的时候是无法判断先算哪个了;这时候就要看结合性了,看是左结合(从左到右执行)还是右结合(从右向左执行)。

列如:3 * 5 / 2 我们知道乘除的优先级是相同的这时候看结合性,我们通过观察上面的表格就会发现他们都是左结合的所以是从左到右去计算。
下面是部分优先级的结合顺序(从高到低)注意大概记住就行,实在记不住可以查表:
• 圆括号( () )
• ⾃增运算符( ++ ),⾃减运算符( – )
• 单⽬运算符( + 和 - )
• 乘法( * ),除法( / )
• 加法( + ),减法( - )
• 关系运算符( < 、 > 等)
• 赋值运算符( = )
实在不行的话读者可以在写代码的时候直接用括号就行,括号的优先级最高。
这里我们给出C语言关于优先级的参考:C语言的优先级。

看完了优先级和结合性紧接着我们就可以来看表达式了:

二,表达式求值

1,整型提升

各位读者第一次看到这个概念可能回比较的懵,我们直接拿出一段代码来举例:

#include<stdio.h>
int main()
{char a = 10;char b =120;char c = a+b;printf("%d",c);
}

在这里插入图片描述
我i们来看结果为什么输出的-126呢?按照常理120+10应该130才对啊,怎么会出现个-126呢?要回答这两个问题就要涉及到整型提升了。我们来看看整型提升的概念

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

比如上面代码中char a和char b 在运算的时候直接被提升为普通整型, 然后再进行加法计算,计算的结果被阶段存在c中。

那如何进行整形提升呢?

负数的整形提升char a=-1
变量a的二进制位(补码)只有8个比特位 因为char类型占1个字节8比特位。 11111111
因为char a为有符号的char,所以再整形提升的时候在剩余的24个字节中补充符号位 即1
整形提升后为:11111111 11111111 11111111 11111111

正数的整形提升char b=1
变量a的二进制位(补码)只有8个比特位 因为char类型占1个字节8比特位。 00000001
因为char a为有符号的char,所以再整形提升的时候在剩余的24个字节中补充符号位 即0
整形提升后为: 00000000 00000000 00000000 00000001

了解完正负数的整形提升之后我们回过头来分析上面代码的结果。

在这里插入图片描述

首先我们用的是%d占位符是打印10进制整数的占位符,其次从图不难看出char类型的取值范围为-128~127,所以10+120是不可能得到130的。这就解决了我们上面的疑问。

这时又要有人问了如果用的是不同类型运算呢?会怎么样?那就要涉及算术转换了。

2,算术转换

算术转换说的是如果某个操作符的各个操作数属于不同的类型,那么除⾮其中⼀个操作数的转换为另⼀个操作数的类 型,否则操作就⽆法进⾏。
下⾯的层次体系称为寻常算术转换。

long double
double
float
unsigned long int 
long int 
unsigned int 
int

如果某个操作数的类型在上面这个列表中排名靠后,那么首先要转换为另外⼀个操作数的类型后执行 运算。比如 int a=10 double b =20.0 那么a+b运算时由于double排名靠前所以int a 会被转化成double a。然后再进行计算
当我们了解这些基本的知识以后我们就可以来看一些表达式了。

三,表达式解析

表达式1:a*b+c*d+e*f 这个表达式的运算路径是什么呢?
首先因为我们知道表达式的求值部分由优先级来决定,所以我们只知道先乘再加是不知道哪个乘法先算,所以造成运算循序有很多种。比如在这里插入图片描述
这里就不一一列举。

表达式2: c + --c; 这段代码歧义就是我们不知道第一个c是使用 - - c后的值还是 - - c之前的值来计算。比如c=5 c+ -- c 可能是5加4也可能是4加4所以这就存在歧义。

表达式3:

int main() 
{ int i = 10; i = i-- - --i * ( i = -3 ) * i++ + ++i; printf("i = %d\n", i); return 0; 
}

这种其实就是错误代码,因为其在不同的编译器下有不同的结果,一定要避免写出这种代码!

表达式4:

#include <stdio.h> int fun() { static int count = 1; return ++count; }int main() { int answer; answer = fun() - fun() * fun(); printf( "%d\n", answer);//输出多少? return 0; }

但是上述代码 answer = fun() - fun() * fun(); 中我们只能通过操作符的优先级得知:先 算乘法,再算减法,函数的调用先后顺序无法通过操作符的优先级确定。

表达式5:

#include <stdio.h> 
int main() 
{ int i = 1; int ret = (++i) + (++i) + (++i); printf("%d\n", ret); printf("%d\n", i); return 0;
}

在这里插入图片描述
ret为12为什么会得到12我们来看看反汇编代码就明白了
在这里插入图片描述

这段代码的反汇编代码实际上就一直在执行++i这个操作当每个i加到4后再去执行三次加法,所以4+4+4=12结果就是这么得到的。 但实际上将这段代码复制到devc++上运行结果也是不同的,大家可以试试。

这段代码中的第⼀个 + 在执行的时候,第三个++是否执行,这个是不确定的,因为依靠操作符的优先级和结合性是无法决定第⼀个 + 和第三个前置 ++ 的先后顺序。
所以这种代码也是有争议的大家要避免写出这种代码!

注意:有关结构的操作符将在结构章节进行介绍!

以上就是操作符的所有内容啦!
感谢能够看到这里的读者,如果我的文章能够帮到你那我甚是荣幸,文章有任何问题都欢迎指出!制作不易还望给一个免费的三连,你们的支持就是我最大的动力!

相关文章:

C语言操作符(下)

上一篇文章传送门&#xff1a;操作符上 前言&#xff1a;上期我们介绍了C语言的操作符的使用方法&#xff0c;这期我们主要侧重讲当我们已经了解了操作符的基本知识后怎样样来看待运算路径的问题。 操作符 一&#xff0c;优先级和结合性1&#xff0c;优先级2&#xff0c;结合性…...

学习资料收藏 游戏开发

本文整理了本人在学习 Unity3D 游戏开发过程中知晓的一些学习资料。 视频教程 siki学院 M_Studio Unity中文课堂 博客 林新发 浅墨_毛星云 冯乐乐 Roystan Sorumi 宣雨松 陆泽西 书籍 《Unity 游戏设计与实现》&#xff08;加藤政树&#xff09; 《Unity Shader 入…...

我的2024年总结

趁着摸鱼赶紧写一下吧 去年目标review 还是将去年的目标完成了一些 【接纳不完美&#xff0c;多拍照片】 这个还是部分做到了&#xff0c;今年和一些朋友们见面时都注意拍照留记录了&#xff0c;不过还可以继续加强&#xff0c;因为外貌上发生了重大变化&#xff0c;下面细说…...

freeswitch在centos上编译过程

操作系统&#xff1a;centos9-last usr/local/freeswitch/bin/freeswitch -version FreeSWITCH version: 1.10.13-devgit~20250125T131725Z~3f1e4bf90a~64bit (git 3f1e4bf 2025-01-25 13:17:25Z 64bit)vi /etc/ssh/sshd_config ip a nmtui reboot ip a curl -o /etc/pki/rpm-…...

docker如何查看容器启动命令(已运行的容器)

docker ps 查看正在运行的容器 该命令主要是为了详细展示查看运行时的command参数 # 通过docker --no-trunc参数来详细展示容器运行命令 docker ps -a --no-trunc | grep <container_name>通过docker inspect命令 使用docker inspect&#xff0c;但是docker inspect打…...

正则表达式以及Qt中的使用

目录 一、正则表达式 1、基本匹配&#xff1a; 2、元字符&#xff1a; 2.1 .运算符&#xff1a; 2.2 字符集&#xff1a; 2.3 重复次数&#xff1a; 2.4 量词{} 2.5 特征标群() 2.6 或运算符 2.7 \反斜线转码特殊字符 2.8 锚点 3、简写字符 4、零宽度断言 4.1 正…...

当高兴、尊重和优雅三位一体是什么情况吗?

英语单词 disgrace 表示“失脸&#xff0c;耻辱&#xff0c;不光彩&#xff0c;名誉扫地”一类的含义&#xff0c;可做名词或动词使用&#xff0c;含义基本一致&#xff0c;只是词性不同。 disgrace n.丢脸&#xff1b;耻辱&#xff1b;不光彩&#xff1b;令人感到羞耻的人(或…...

Vue 3 中的 TypeScript:接口、自定义类型与泛型

在 Vue 3 中&#xff0c;TypeScript 提供了强大的类型系统&#xff0c;帮助我们更好地管理代码的类型安全。通过使用 接口&#xff08;Interface&#xff09;、自定义类型&#xff08;Type Aliases&#xff09; 和 泛型&#xff08;Generics&#xff09;&#xff0c;我们可以编…...

【Super Tilemap Editor使用详解】(十六):高级主题:深入理解 Super Tilemap Editor

在本节中,我们将深入探讨 Super Tilemap Editor 的工作原理,特别是图块地图(Tilemap)的渲染机制以及如何优化性能。这些知识将帮助你更好地理解工具的内部机制,并在开发中做出更明智的决策。 一、图块地图与图块渲染 图块地图是 Super Tilemap Editor 的核心组件之一。它由…...

如何运用python爬虫爬取知网相关内容信息?

爬取知网内容的详细过程 爬取知网内容需要考虑多个因素&#xff0c;包括网站的结构、反爬虫机制等。以下是一个详细的步骤和代码实现&#xff0c;帮助你使用Python爬取知网上的论文信息。 1. 数据准备 首先&#xff0c;需要准备一些基础数据&#xff0c;如知网的URL、请求头…...

2025年数学建模美赛 A题分析(2)楼梯使用频率数学模型

2025年数学建模美赛 A题分析&#xff08;1&#xff09;Testing Time: The Constant Wear On Stairs 2025年数学建模美赛 A题分析&#xff08;2&#xff09;楼梯磨损分析模型 2025年数学建模美赛 A题分析&#xff08;3&#xff09;楼梯使用方向偏好模型 2025年数学建模美赛 A题分…...

云原生:构建现代化应用的基石

一、什么是云原生&#xff1f; 云原生是一种构建和运行应用程序的方法&#xff0c;旨在充分利用云计算的分布式系统优势&#xff0c;例如弹性伸缩、微服务架构、容器化技术等。云原生应用程序从设计之初就考虑到了云环境的特点&#xff0c;能够更好地适应云平台的动态变化&…...

18.Word:数据库培训课程❗【34】

目录 题目 NO1.2.3.4 NO5设置文档内容的格式与样式 NO6 NO7 NO8.9 NO10.11标签邮件合并 题目 NO1.2.3.4 FnF12&#xff1a;打开"Word素材.docx”文件,将其另存为"Word.docx”在考生文件夹下之后到任务9的所有操作均基于此文件&#xff1a;"Word.docx”…...

批量创建ES索引

7.x from elasticsearch import Elasticsearch# 配置 Elasticsearch 连接 # 替换为你的 Elasticsearch 地址、端口、用户名和密码 es Elasticsearch([http://10.10.x.x:43885],basic_auth(admin, XN272G9THEAPYD5N5QORX3PB1TSQELLB) )# # 测试连接 # try: # # 尝试获取集…...

RoboVLM——通用机器人策略的VLA设计哲学:如何选择骨干网络、如何构建VLA架构、何时添加跨本体数据

前言 本博客内解读不少VLA模型了&#xff0c;包括π0等&#xff0c;且如此文的开头所说 前两天又重点看了下openvla&#xff0c;和cogact&#xff0c;发现 目前cogACT把openvla的动作预测换成了dit&#xff0c;在模型架构层面上&#xff0c;逼近了π0​那为了进一步逼近&#…...

25美赛ABCDEF题详细建模过程+可视化图表+参考论文+写作模版+数据预处理

详情见该链接&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 25美国大学生数学建模如何准备&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;-CSDN博客文章浏览阅读791次&#xff0c;点赞13次&#xff0c;收藏7次。通过了解比赛基本…...

基于RIP的MGRE VPN综合实验

实验拓扑 实验需求 1、R5为ISP&#xff0c;只能进行IP地址配置&#xff0c;其所有地址均配为公有IP地址&#xff1b; 2、R1和R5间使用PPP的PAP认证&#xff0c;R5为主认证方&#xff1b; R2与R5之间使用ppp的CHAP认证&#xff0c;R5为主认证方&#xff1b; R3与R5之间使用HDLC封…...

如何获取小程序的code在uniapp开发中

如何获取小程序的code在uniapp开发中&#xff0c;也就是本地环境&#xff0c;微信开发者工具中获取code&#xff0c;这里的操作是页面一进入就获取code登录&#xff0c;没有登录页面的交互&#xff0c;所以写在了APP.vue中&#xff0c;也就是小程序一打开就获取用户的code APP.…...

【Linux】 冯诺依曼体系与计算机系统架构全解

Linux相关知识点可以通过点击以下链接进行学习一起加油&#xff01;初识指令指令进阶权限管理yum包管理与vim编辑器GCC/G编译器make与Makefile自动化构建GDB调试器与Git版本控制工具Linux下进度条 冯诺依曼体系是现代计算机设计的基石&#xff0c;其统一存储和顺序执行理念推动…...

RDMA 工作原理 | 支持 RDMA 的网络协议

注&#xff1a;本文为 “RDMA” 相关文章合辑。 英文引文机翻未校。 图片清晰度受引文所限。 Introduction to Remote Direct Memory Access (RDMA) Written by: Dotan Barak on March 31, 2014.on February 13, 2015. What is RDMA? 什么是 RDMA&#xff1f; Direct me…...

Autosar-Os是怎么运行的?(多核系统运行)

写在前面&#xff1a; 入行一段时间了&#xff0c;基于个人理解整理一些东西&#xff0c;如有错误&#xff0c;欢迎各位大佬评论区指正&#xff01;&#xff01;&#xff01; 目录 1.Autosar多核操作系统 1.1多核启动过程 1.2多核运行过程 1.2.1核间任务同步 1.2.2Counte…...

golang命令大全4--测试与调试

Go 语言提供了一系列强大的工具和命令来帮助开发者进行代码的测试与性能调优。 1、go test 功能 go test是 Go 语言内置的测试工具&#xff0c;用于执行 Go 项目中的单元测试。它会查找当前包中所有以 _test.go 结尾的文件&#xff0c;运行其中定义的测试函数&#xff0c;并…...

第27篇 基于ARM A9处理器用C语言实现中断<三>

Q&#xff1a;基于ARM A9处理器怎样设计C语言工程&#xff0c;同时使用按键中断和定时器中断在红色LED上计数&#xff1f; A&#xff1a;基本原理&#xff1a;设置HPS Timer 0和按键中断源&#xff0c;主程序调用set_A9_IRQ_stack( )函数设置中断模式的ARM堆栈指针&#xff0c…...

linux下使用脚本实现对进程的内存占用自动化监测

linux系统中常用cat /proc/{pid}/status和pmap -x {pid}来监测某个进程的内存资源占用情况。 其中注意各参数的含义如下&#xff1a; VmSize&#xff1a;表示进程当前虚拟内存大小 VmPeak&#xff1a;表示进程所占用最大虚拟内存大小 VmRSS&#xff1a;表示进程当前占用物理内…...

安宝特方案 | 智能培训:安宝特AR如何提升企业技能培训的效率与互动性

随着企业不断推进数字化转型&#xff0c;传统培训方式已无法满足现代企业对高效、灵活培训的需求。尤其在技术更新频繁、工艺流程复杂、员工流动性大的环境中&#xff0c;传统培训模式的局限性愈加明显。为了提升培训质量、降低培训成本&#xff0c;并帮助员工迅速掌握新技能&a…...

golang通过AutoMigrate方法自动创建table详解

一.AutoMigrate介绍 1.介绍 在 Go 语言中&#xff0c;GORM支持Migration特性&#xff0c;支持根据Go Struct结构自动生成对应的表结构,使用 GORM ORM 库的 AutoMigrate 方法可以自动创建数据库表&#xff0c;确保数据库结构与定义的模型结构一致。AutoMigrate 方法非常方便&am…...

【信息系统项目管理师-选择真题】2013上半年综合知识答案和详解

更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 【第1题】【第2题】【第3题】【第4题】【第5题】【第6题】【第7题】【第8题】【第9题】【第10题】【第11题】【第12题】【第13题】【第14题】【第15题】【第16题】【第17题】【第18题】【第19题】【第20题】【第…...

智能调度体系与自动驾驶技术优化运输配送效率的研究——兼论开源AI智能名片2+1链动模式S2B2C商城小程序的应用潜力

摘要&#xff1a;随着全球化和数字化进程的加速&#xff0c;消费者需求日益呈现出碎片化和个性化的趋势&#xff0c;这对物流运输行业提出了前所未有的挑战。传统的物流调度体系与调度方式已难以满足当前复杂多变的物流需求&#xff0c;因此&#xff0c;物流企业必须积极引入大…...

【软件测试项目实战 】淘宝网:商品购买功能测试

一、用例设计方法分析 在对淘宝网商品下单功能进行测试时&#xff0c;不同的测试角度和场景适合运用不同的用例设计方法&#xff0c;以下是针对该功能各方面测试所适用方法及其原因的分析&#xff1a; 商品数量相关测试&#xff1a;对于商品数量的测试&#xff0c;主要采用等…...

[牛客]公交线路(dijkstra+链式前向星)

登录—专业IT笔试面试备考平台_牛客网 #include<bits/stdc.h> using namespace std; #define endl \n typedef long long ll; const int N1e65,M1e85; int cnt0,head[N]; int n,m,s,t; struct node {int v,w,next; }edge[M]; void addedge(int u,int v,int w) {cnt;edge…...