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

C/C++运算优先级

文章目录

  • 前言
  • 1.运算优先级表
  • 2.举例说明:
  • 总结

前言

最近复习C++基础知识的时候,发现对这部分还是有些模糊。常用的+ - × ÷
,括号等运算符对于它们的优先级还是比较明确的。但是涉及到移位运算,逻辑运算这种,再结合四则运算,就有点分不清了。
为此这篇博客就记录一下,后面再稍微结合点例子举例说明一下。


1.运算优先级表

优先级运算符功能目数结合性
1( )改变运算优先级或函数调用双目从左向右
[ ]访问数组元素
.直接访问数据成员
->间接访问数据成员
2!逻辑非单目从右到左
~按位取反
+,-取正,取负
*间接访问对象
&取对象地址
++,- -增1,减1
( )强制类型转换
sizeof测类型长度
3*,/,%乘除取余双目从左到右
4+,-加减
5<<,>>,>>>按位左移,按位右移,无符号右移
6<,<=,>,>=小于,小于等于,大于,大于等于
7==,!=等于,不等于
8&按位与
9^按位异或
10|按位或
11&&逻辑与
12||逻辑或
13?:条件运算符三目从右向左
14=赋值双目从右向左
+=,-=加赋值,减赋值
*=,/=乘赋值,除赋值
%=,&=取余赋值,按位与赋值
^=按位异或赋值
|=按位或赋值
<<=按位左移赋值
>>=按位右移赋值
15,逗号运算符双目从左向右

2.举例说明:

Example1

求值:5+10*20/2

这个就是简单的四则运算,先乘除再加减。
对应一下上面的表就是,乘除的优先级3比加减的优先级4要高,所以先乘除,同时满足从左到右,因此先是乘,10乘以20,再是除,200除以2,最后在加5,得到的答案为105

Example2

求值:12 / 3 * 4 + 5 * 15 + 24 % 4 / 2

这个和上面类似,只不过多了一个取余%,结合上表,优先级3,4两行。
所要求的式子等价于((12 / 3) * 4) + (5 * 15) + ((24 % 4) / 2)=9

Example3

假设i、j和k是三个整数,说明表达式i!=j<k的含义。

这题就是比较!=<之间优先级的比较。
查一下表可以看到!=优先级为7,<为6,所以应该先算小于,再判断不等号。
因此上式的求值过程等同于i !=(j<k),先比较j和k的大小,得到的结果是一个布尔值(1或0);然后判断i的值与之是否相等。

Example4

因为运算符的优先级问题,下面这条表达式无法通过编译。根据上表指出它的问题在哪里?应该如何修改?
string s = “word” ;
string pl = s + s[s.size ( ) - 1] == ‘s’? “” : “s” ;

看这个第二句赋值语句,我们是想判断字符串s的最后一个字符是否是s,如果是的话就不变,否则就让s字符串的最后一个字符为s。
但是这里因为运算符优先级问题,无法实现我们想要的效果。

题目中的几个运算符的优先级次序从高到低是加法运算符、相等运算符、条件运算符和赋值运算符,因此式子的求值过程是先把s和 s [s.size ( ) - 1]相加得到一个新字符串,然后该字符串与字符’s’比较是否相等,这是一个非法操作,并且与程序的原意不符。
要想实现程序的原意,即先判断字符串s 的最后一个字符是否是’s’,如果是,什么也不做;如果不是,在 s 的末尾添加一个字符’s’,我们应该添加括号强制限定运算符的执行顺序。
string pl = s + (s [s.size() - 1] == 's'? "" : "s") ;

Example5

如果一台机器上int占32位.char占8位,用的是 Latin-1字符集,其中字符’q’的二进制形式是01110001,那么表达式~ ‘q’<<6的值是什么?

在位运算符中,运算符~(优先级2)的优先级高于<<(优先级5),因此先对q按位求反,因为位运算符的运算对象应该是整数类型,所以字符’q’首先转换为整数类型。如题所示,char占8位而int占32位,所以字符’q’转换后得到
00000000 0000000 00000000 01110001,按位求反得到11111111 11111111 11111111 10001110;接着执行移位操作,得到11111111 11111111 11100011 10000000。
C++规定整数按照其补码形式存储,对上式求补,得到10000000 000000000011100 10000000,即最终结果的二进制形式,转换成十进制形式是-7296

Example6

说明下面这条表达式的含义。
somevalue ?++x,++y : - -x,- -y

这个咋一看,somevalue为真,那就++x,++y,否则就- -x,- -y。
我们自己看一下上面的表,这里的条件运算符和逗号之间的优先级还是存在一些差异的。

C++规定条件运算符的优先级高于逗号运算符,所以somevalue ? ++x,++y :- -x,- -y
实际上等价于(somevalue ? ++x,++y : - -x),- -y。
它的求值过程是,首先判断somevalue是否为真,如果为真,依次执行++x和++y,最后执行- -y;如果为假,执行- -x和- -y。


总结

这篇博客总结了一下运算优先级表,并举了一些简单和稍微复杂的例子作为辅助。后期在编程中遇到优先级问题,其实最好的方式我觉得是加括号。但是有时做题目,或者看别人的代码,理解时还需要脑子里有这个对照表。

相关文章:

C/C++运算优先级

文章目录 前言1.运算优先级表2.举例说明&#xff1a;总结 前言 最近复习C基础知识的时候&#xff0c;发现对这部分还是有些模糊。常用的 - &#xff0c;括号等运算符对于它们的优先级还是比较明确的。但是涉及到移位运算&#xff0c;逻辑运算这种&#xff0c;再结合四则运算…...

apache搭建静态网站,moongoose搭建网站后台,出现的跨域问题解决

文章目录 1&#xff0c;问题描述1.1&#xff0c;当网页和后台是不同服务时会产生跨域问题1.2&#xff0c;跨域问题 2&#xff0c;nginx端口转发解决跨域问题2.1&#xff0c;下载并安装nginx2.1.1&#xff0c;解压后如下所示2.1.2&#xff0c;进入解压目录后&#xff0c;执行配置…...

LiveQing视频点播流媒体RTMP推流服务功能-支持视频点播分屏大屏展示视频轮巡分组播放RMP推流直播大屏展示

LiveQing支持视频点播分屏大屏展示视频轮播分组播放RMP推流直播大屏展示 1、分屏展示2、轮巡播放3、RTMP推流视频直播和点播流媒体服务 1、分屏展示 LiveQing支持将视频点播、鉴权直播&#xff0c;拉转直播视频流&#xff0c;进行分屏播放。 2、轮巡播放 3、RTMP推流视频直播和…...

tf loss构建常用到函数

1、tf.map_fn tf.map_fn是TensorFlow中的一个函数&#xff0c;用于对给定的函数和输入进行逐元素的映射&#xff0c;其定义如下&#xff1a; tf.map_fn(fn,elems,dtypeNone,parallel_iterationsNone,back_propTrue,swap_memoryFalse,infer_shapeTrue,nameNone,fn_output_sign…...

行为型模式-备忘录模式

备忘录模式保存一个对象的某个状态&#xff0c;以便在适当的时候恢复对象。备忘录模式属于行为型模式。 意图&#xff1a;在不破坏封装性的前提下&#xff0c;捕获一个对象的内部状态&#xff0c;并在该对象之外保存这个状态。 主要解决&#xff1a;所谓备忘录模式就是在不破坏…...

Android Studio初学者实例:RecyclerView学习--模仿今日头条--续

新学期开始了&#xff0c;这篇文章收到了很多人的评论有很多地方不懂&#xff0c;所以写下了以下的文章--续篇 首先使用RecyclerView也好还是使用ListView&#xff0c;更或是GridView你都要先构思需要什么 这些东西无一例外通常都是用在列表显示下&#xff0c;那么需要一些&a…...

栈和队列的C++模拟实现

一、栈stack 1.介绍&#xff08;库里面的文档介绍&#xff09; 1. stack是一种容器适配器&#xff0c;专门用在具有后进先出操作的上下文环境中&#xff0c;其删除只能从容器的一端进行元素的插入与提取操作。 2. stack是作为容器适配器被实现的&#xff0c;容器适配器即是对…...

UE4/5:通过Blender制作BlendShape导入【UE4/5曲线、变形目标,blender形态键】

UE4/5里面&#xff0c;我们经常可以在一些骨骼模型上面看到相关的曲线&#xff0c;如Metahuman里面就是通过这个曲线来改变人物的脸部表情。 而这里笔者将教导如何去制作这种曲线。 这种曲线都是存在于骨骼模型上的&#xff0c;所以我们要么直接制作骨骼模型导入ue&#xff0…...

微信小程序进阶——后台交互

目录 一、后台准备 1.1 pom.xml 1.2 配置数据源 1.3 整合mybatis 二、前后端交互 2.1 method1 2.2 method2 2.2.1 封装request 2.2.2 头部引用util 2.2.3 编写方法 2.2.4 展示效果 三、WXS的使用 3.1 会议状态 3.1.2 引入wxs 3.1.3 修改代码 3.1.4 展示效果 3…...

二维码智慧门牌管理系统升级解决方案:突破传统,实现质检与抽检的个性化配置

文章目录 前言一、引入“独立质检”二、个性化抽检类别设定三、触发重采要素的功能升级四、升级优势与展望 前言 在数字化时代&#xff0c;智慧门牌管理系统已经成为社会管理的重要工具。为了满足各种复杂需求&#xff0c;系统升级是必然趋势。本次升级主要针对质检和抽检两大…...

《动手学深度学习 Pytorch版》 9.4 双向循环神经网络

之前的序列学习中假设的目标是在给定观测的情况下对下一个输出进行建模&#xff0c;然而也存在需要后文预测前文的情况。 9.4.1 隐马尔可夫模型中的动态规划 数学推导太复杂了&#xff0c;略。 9.4.2 双向模型 双向循环神经网络&#xff08;bidirectional RNNs&#xff09;…...

【Axure高保真原型】可视化图表图标

今天和粉丝们免费分享可视化图表图标原型模板&#xff0c;包括柱状图、条形图、环形图、散点图、水波图等常用的可视化图表图标。 【原型效果】 【原型预览】 https://axhub.im/ax9/d402c647c82f9185/#c1 【原型下载】 这个模板可以在 Axure高保真原型哦 小程序里免费下载哦…...

安装mmcv及GPU版本的pytorch及torchvision

一、先装GPU版本的pytorch和torchvision pip install torch1.9.1cu111 torchvision0.10.1cu111 torchaudio0.9.1 -f https://download.pytorch.org/whl/torch_stable.html注意&#xff1a;以上适用cuda11.1版本 如果想离线安装&#xff0c;就看这篇文章 二、安装mmcv 看这篇…...

全国342个城市往返最短通勤时间(铁路)数据

全国342个城市往返最短通勤时间&#xff08;铁路&#xff09;数据 1、时间&#xff1a;采集时间是2022年 2、来源&#xff1a;12306 3、数据说明&#xff1a;数据采集12306数据&#xff0c;整理全国342个城市往返最短通勤时间&#xff0c;本数据是铁路包含动车、高铁所有路线…...

AWK语言第二版 第3章.探索性数据分析 3.1泰坦尼克号的沉没

这章也是第一版没有&#xff0c;第二版新增的。 3. 探索性数据分析 上一章给出了一些个人使用的小脚本&#xff0c;通常是特制或专用的。在本章中&#xff0c;我们还会展示Awk在现实中的典型使用场景&#xff1a;使用Awk和其他工具来非正式地探索一些真实的数据&#xff0c;目…...

微信小程序设计之主体文件app-json-window

一、新建一个项目 首先&#xff0c;下载微信小程序开发工具&#xff0c;具体下载方式可以参考文章《微信小程序开发者工具下载》。 然后&#xff0c;注册小程序账号&#xff0c;具体注册方法&#xff0c;可以参考文章《微信小程序个人账号申请和配置详细教程》。 在得到了测…...

WebDAV之π-Disk派盘 + 密码键盘

密码键盘是一款密码管理器,可以存储和管理需要受保护的数据。为方便日常使用,同时也是一款安全输入法,帮您安全便捷地填写账号密码、通用内容、卡包信息。 密码键盘使用军事级的 PBKDF2 有损加密算法保护您的根密码,使用军事级的 AES 加密算法保护您的存储数据。云端再额外…...

LeetCode讲解篇之77. 组合

文章目录 题目描述题解思路题解代码 题目描述 题解思路 遍历nums&#xff0c;让当前数字添加到结果前缀中&#xff0c;递归调用&#xff0c;直到前缀的长度为k&#xff0c;然后将前缀添加到结果集 题解代码 func combine(n int, k int) [][]int {var nums make([]int, n)fo…...

【openwrt学习笔记】Dying Gasp功能和pstore功能的配置(高通 ipq95xx)

目录 一、Dying Gasp信号1.1 概念1.2 实现原理 二、pstore 功能2.1 概念2.2 实现原理 三、openwrt中开启pstore功能3.1 软硬件参数3.2 各文件修改3.2.1 defconfig3.2.2 dts(ipq9574-default-memory.dtsi)3.2.3 fs/pstore/ram.c 四、测试4.1 挂载4.2 触发命令和效果 参考资料&am…...

使用RestSharp和C#编写程序

以下是一个使用RestSharp和C#编写的爬虫程序&#xff0c;用于爬取www.zhihu.com上的视频。此程序使用了https://www.duoip.cn/get_proxy来获取代理IP。 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks…...

变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析

一、变量声明设计&#xff1a;let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性&#xff0c;这种设计体现了语言的核心哲学。以下是深度解析&#xff1a; 1.1 设计理念剖析 安全优先原则&#xff1a;默认不可变强制开发者明确声明意图 let x 5; …...

从零实现富文本编辑器#5-编辑器选区模型的状态结构表达

先前我们总结了浏览器选区模型的交互策略&#xff0c;并且实现了基本的选区操作&#xff0c;还调研了自绘选区的实现。那么相对的&#xff0c;我们还需要设计编辑器的选区表达&#xff0c;也可以称为模型选区。编辑器中应用变更时的操作范围&#xff0c;就是以模型选区为基准来…...

MongoDB学习和应用(高效的非关系型数据库)

一丶 MongoDB简介 对于社交类软件的功能&#xff0c;我们需要对它的功能特点进行分析&#xff1a; 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具&#xff1a; mysql&#xff1a;关系型数据库&am…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述&#xff1a;iview使用table 中type: "index",分页之后 &#xff0c;索引还是从1开始&#xff0c;试过绑定后台返回数据的id, 这种方法可行&#xff0c;就是后台返回数据的每个页面id都不完全是按照从1开始的升序&#xff0c;因此百度了下&#xff0c;找到了…...

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

ServerTrust 并非唯一

NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...

如何在网页里填写 PDF 表格?

有时候&#xff0c;你可能希望用户能在你的网站上填写 PDF 表单。然而&#xff0c;这件事并不简单&#xff0c;因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件&#xff0c;但原生并不支持编辑或填写它们。更糟的是&#xff0c;如果你想收集表单数据&#xff…...

C++使用 new 来创建动态数组

问题&#xff1a; 不能使用变量定义数组大小 原因&#xff1a; 这是因为数组在内存中是连续存储的&#xff0c;编译器需要在编译阶段就确定数组的大小&#xff0c;以便正确地分配内存空间。如果允许使用变量来定义数组的大小&#xff0c;那么编译器就无法在编译时确定数组的大…...

LRU 缓存机制详解与实现(Java版) + 力扣解决

&#x1f4cc; LRU 缓存机制详解与实现&#xff08;Java版&#xff09; 一、&#x1f4d6; 问题背景 在日常开发中&#xff0c;我们经常会使用 缓存&#xff08;Cache&#xff09; 来提升性能。但由于内存有限&#xff0c;缓存不可能无限增长&#xff0c;于是需要策略决定&am…...

C# 表达式和运算符(求值顺序)

求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如&#xff0c;已知表达式3*52&#xff0c;依照子表达式的求值顺序&#xff0c;有两种可能的结果&#xff0c;如图9-3所示。 如果乘法先执行&#xff0c;结果是17。如果5…...