《C++ Primer》第4章 表达式(一)

news2024/11/18 11:31:43

参考资料:

  • 《C++ Primer》第5版
  • 《C++ Primer 习题集》第5版

4.1 基础(P120)

表达式由一个或多个运算对象组成,对表达式求值将得到一个结果。字面量和变量是最简单的表达式。

4.1.1 基本概念(P120)

C++ 定义了若干一元运算符、二元运算符,还有一个三元运算符,函数调用也是一种特殊的运算符。

组合运算符和运算对象

对以一个复杂的表达式,我们首先要理解其运算符的优先级结合律,以及运算对象的求值顺序

运算对象的转换

小整型会被提升为大整型。

重载运算符

重载运算符时,运算对象的类型和返回值的类型是可以重新定义的,但运算对象的个数、运算符的优先级和结合律是不能改变的。

左值和右值

C++ 表达式要么是右值,要么是左值。一个左值表达式的求值结果为一个对象或者一个函数,一般而言,左值可以位于赋值语句的左侧,但以常量对象为代表的某些左值不能位于赋值语句的左侧。右值表达式的结果不能位于赋值语句的左侧,且某些右值表达式的求职结果也是对象。

当一个对象被用作右值的时候,用的是对象的;当其被用作左值的时候,用的是对象的身份(内存中的地址)。左值可以当作右值使用,而右值不能当左值使用。常见的需要使用左值的运算符:

  • 赋值运算符需要左值作为其左侧运算对象,结果同样为左值。
  • 取地址符作用于左值对象,结果为右值。
  • 内置的解引用、下标运算符、迭代器的解引用、stringvector 的下标运算符的结果都是左值,

4.1.2 优先级与结合律(P121)

高优先级运算符与运算对象的结合更加紧密,如果优先级相同,则组合规律由结合律确定。算术运算符满足左结合律,即优先级相同时,将按照从左到右的顺序计算

括号无视优先级与结合律

被括号括起来的部分会被当成一个单元来求值,然后再与其他部分组合。

4.1.3 求值顺序

优先级规定了运算对象组合方式,但没有说明运算对象按照什么顺序求值:

int i = f1() + f2();

f1f2 一定会在执行乘法前调用,但两个函数执行的先后顺序是没有规定的。

对于那些未指定执行顺序的运算符来说,如果表达式指向并修改了同一个对象,则将引发未定义行为

下面 4 种运算符明确指定了运算对象的求值顺序:&&||?:,

求值顺序、优先级、结合律

对于下面的表达式:

f() + g()*h() + j();

优先级规定了 g()h() 的返回值相乘;结合律规定了 g()h() 的乘积先和 f() 相加;这些函数的调用顺序没有规定。

书写复合表达式的两条经验:

  • 在不确定运算符优先级和结合律的情况下最好使用括号
  • 如果改变了某个运算对象的值,则在表达式的其他地方不要再使用这个对象。例外情况:*++iter

4.2 算术运算符(P124)

算术运算符的结果为右值

image-20230927105601000

一元正号和一元负号,如 +a 可以理解为 0 + a ,其中 0int 类型:

bool b = true;
bool b2 = -b;    // b2是true

当计算的结果超过该类型的表示范围时就会产生溢出,溢出的结果是不可预知的,不同的系统可能有不同的结果。

整数相除的结果为整数,小数部分直接舍弃(向 0 取整)。

对取余运算来说,在不溢出的前提下恒有 m % (-n) 等价于 m % n(-m) % n 等价于 -(m % n)

21 % -6;    // 结果为3
-21 % 6;    // 结果为-3

4.3 逻辑和关系运算符(P126)

image-20230927110605603

关系运算符作用域算术类型或指针类型,逻辑运算符作用于任何能转换成布尔值的类型。

逻辑与和逻辑和运算符

短路求值:&&|| 都是先求左侧运算对象再求右侧对象。

vector<string> text{"hello", "world"};
for(const auto &s : text){
    cout << s << endl;
}

上面的代码中,由于 string 类型对象可能较大,将 s 声明成引用可以避免对元素的拷贝。同时,由于不需要对 string 对象进行写操作,所以将 s 声明成 const

逻辑非运算符

关系运算符

关系运算符的结果为布尔值,所以其在连用时需要特别注意:

if(1 < 9 < 2)    // 结果为真

相等性测试与布尔字面值

进行比较运算时,除非比较的对象是布尔类型,否则不要使用布尔字面值。

练习

Screenshot_20230927_155143

字符串字面量等价于以 \0 结尾的字符数组,所以上面的声明等价于让 cp 指向一个字符数组的首元素。

4.4 赋值元素符(P129)

赋值运算符的左侧对象必须为可修改左值,运算结果为其左侧运算对象。如果赋值运算符两侧对象的类型不同,则右侧对象将转换为左侧对象。

C++11 允许将花括号括起来的初始值列表作为赋值语句的右侧对象:

vector<int> vi{1, 2, 3};
vi = {4, 5, 6, 7};

如果赋值运算符左侧为内置类型,则列表最多只能包含一个值,且其所占空间不应大于目标类型空间。

无论左侧对象的类型是什么,初始值列表均可以为空,此时编译器将创建一个值初始化的临时量并将其赋值给左侧对象。

赋值运算满足右结合律

i = j = 0;

赋值运算优先级较低

切勿混淆相等运算符和赋值运算符

复合赋值运算符

如:+=-= 等等。

任何一种复合运算符都等价于 a = a op b ,但复合运算符只求值一次,而使用普通的运算符还要进行一次额外的赋值。

4.5 递增和递减运算符(P131)

++-- 为对象的加 1 和减 1 提供了一种简洁的写法。此外,这两个运算符可以应用于迭代器,而很多迭代器不支持算术运算,所以递增递减运算是必要的。

递增递减运算符作用于左值对象,有前置版本和后置版本。前置版本返回将对象本身作为左值返回,后置版本将对象原始值的副本作为右值返回。

除非必须,否则不用递增递减运算符的后置版本,因为相比前置版本,后置版本需要将原始值保存下来,造成浪费。

在一条语句中混用解引用和递增运算符

auto p = v.begin();
while(p != v.end && *p >= 0){
    cout << *p++ << endl;    // 输出当前值,并将p向前移动一个元素
}

运算对象可以按任意顺序求值

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

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

相关文章

淘宝拍立淘插件转链和商业化图片生成接口介绍,图片搜索商品接口,按图搜索接口,图片识别商品接口介绍

淘宝拍立淘是淘宝网推出的一种搜索方式&#xff0c;通过拍立淘&#xff0c;用户可以输入文字描述或上传图片来搜索商品。拍立淘通过与淘宝网进行数据接入和授权&#xff0c;使用淘宝提供的API获取商品信息和操作权限&#xff0c;拍立淘使用图像识别技术&#xff0c;通过深度学习…

【Java 进阶篇】深入理解SQL的数据操作语言(DML)

SQL&#xff08;Structured Query Language&#xff09;是一种用于管理和操作关系数据库的强大语言。SQL语言被分为多个子语言&#xff0c;其中之一是DML&#xff08;Data Manipulation Language&#xff09;&#xff0c;用于执行与数据的操作和管理相关的任务。在本文中&#…

Ci2451-2.4g无线MCU收发芯片

Ci2451 是一款集成无线收发器和8位RISC(精简指令集)MCU的SOC芯片。 无线MCU解决方案,集成丰富的MCU资源、更小尺寸,来满足设计中的各种内存、功率、尺寸要求,充分缩短2.4GHz无线产品设计周期并优化产品成本。 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff…

聚观早报 | 智界S7正式亮相;ChatGPT重磅更新

【聚观365】9月27日消息 智界S7正式亮相 ChatGPT重磅更新 PICO应用数量已超530款 泡泡玛特上半年海外营收大增 亚马逊投资Anthropic40亿美元 智界S7正式亮相 在日前举行的华为秋季全场景新品发布会上&#xff0c;华为智选车业务首款轿车智界S7正式亮相&#xff0c;定位高…

华为云云耀云服务器L实例评测|使用华为云耀云服务器L实例的CentOS部署Docker并运行Tomcat应用

目录 前言 步骤1&#xff1a;登录到华为云耀云服务器L实例 步骤2&#xff1a;安装Docker 并验证Docker安装 步骤3&#xff1a;拉取Tomcat镜像并运行Tomcat容器 步骤4&#xff1a;放行8080端口 步骤5&#xff1a;访问tomcat 步骤6&#xff1a;管理Tomcat容器 小结 前言 …

干洗店收银系统、上门洗鞋小程序,干洗店会员管理系统

干洗店收银系统、上门洗鞋小程序&#xff0c;干洗店会员管理系统可以增加洗衣店的优势&#xff0c;让干洗店回本快&#xff0c;通过发行会员卡卡促销回收资金带来效益&#xff0c;减少投资压力。 干洗店管理软件功能介绍 预约上门收衣 智能提醒&#xff0b;员工手机APP抢单AP…

ORACLE 在内存管理机制上的演变和进化

截止目前&#xff0c;计算机内存仍然被认为是我们可以获得的最快速度的物理存储设备。 将频繁访问的数据尽可能地置于内存中&#xff0c;已成为当前各种软件和应用程序提高数据访问性能&#xff0c;减少访问延迟的最为有效的途径。 然而&#xff0c;内存作为关键的计算资源&am…

uni-app:showModal消息提示(确认、取消)

效果 代码 <template><view><button longpress"handleLongPress">点我出现删除消息</button></view> </template><script>export default {data() {return {};},methods: {handleLongPress(e) {//删除设备uni.showModal(…

小白vite+vue3搭建项目整个流程

第一步 查看npm 版本npm -v&#xff0c;npm版本是7&#xff0c;创建项目命令&#xff1a; npm create vitelatest threejsVue -- --template vue第二步 // 进入项目名为threejsVue的项目命令 cd threejsVue // 安装路由 npm install vue-router4 // 安装css npm install -D s…

uni-app实现图片预览

uni.previewImage预览图片 使用方法&#xff1a; <image class"poster" :src"imageUrl" mode"" click"previewImg(imageUrl)"></image>const previewImg (e) > {uni.previewImage({current: e,urls: image}); } 官…

Java+Vue 实现消息通知示例

前端代码部分&#xff1a; 右上方小铃铛组件 <template><div><el-popover placement"bottom" :width"280" trigger"click"><template #reference><el-badge :is-dot"isDot" class"item" style&…

【React】组件实例三大属性state、props、refs

state React 把组件看成是一个状态机&#xff08;State Machines&#xff09;。通过与用户的交互&#xff0c;实现不同状态&#xff0c;然后渲染 UI&#xff0c;让用户界面和数据保持一致。 React 里&#xff0c;只需更新组件的 state&#xff0c;然后根据新的 state 重新渲染用…

深信服应用交付 AD 存在远程命令执行漏洞 附POC

文章目录 深信服应用交付 AD 存在远程命令执行漏洞 附POC1. 深信服应用交付 AD 简介2.漏洞描述3.影响版本4.fofa查询语句5.漏洞复现6.POC&EXP7.整改意见8.往期回顾 深信服应用交付 AD 存在远程命令执行漏洞 附POC 免责声明&#xff1a;请勿利用文章内的相关技术从事非法测…

命运2中文wiki搭建记录——MediaWiki安装与初设置

命运2中文wiki搭建记录 本文转自我的博客&#xff0c;原文地址——>命运2中文wiki搭建记录——MediaWiki安装与初设置 可能是出于闲的发霉&#xff0c;想自己搭建一个命运2wiki。 因为bilibili上的命运2Bwiki也全是自己搭的。指路——>命运2Bwiki 但是当自己实际上手Me…

USB 2.0 10/100M Ethernet Adaptor 有线网卡驱动

USB 2.0 10/100M Ethernet Adaptor有线网卡驱动&#xff0c;天蓝透明色和带线的USB网卡都适用卡&#xff0c;支持WIN7 32位。外接网卡&#xff0c;外置USB网卡驱动 平板电脑网卡驱动 以太网驱动亲测可用 USB2.0 Ethernet Adapter是USB2.0接口的以太网适配器即网卡。 把USB有线…

记录一个 GUI 库的对比测试结果

1&#xff0c;Java 的 JavaFX 2&#xff0c;golang 的 Fyne 1, Java 测试的是一个俄罗斯方块的 GUI 程序。一切正常。 2&#xff0c;Golang github 的原仓库网络问题&#xff0c;没能测试上&#xff0c;使用以下库 https://gitee.com/mirrors/Fyne 下载代码后提示“编译失…

【力扣2057】值相等的最小索引

&#x1f451;专栏内容&#xff1a;力扣刷题⛪个人主页&#xff1a;子夜的星的主页&#x1f495;座右铭&#xff1a;前路未远&#xff0c;步履不停 目录 一、题目描述二、题目分析 一、题目描述 题目链接&#xff1a;值相等的最小索引 给你一个下标从 0 开始的整数数组 nums …

基于springboot实现二手交易平台管理系统演示【项目源码】分享

基于springboot实现二手交易平台管理系统演示 java简介 Java语言是在二十世纪末由Sun公司发布的&#xff0c;而且公开源代码&#xff0c;这一优点吸引了许多世界各地优秀的编程爱好者&#xff0c;也使得他们开发出当时一款又一款经典好玩的小游戏。Java语言是纯面向对象语言之…

中国沿海水产养殖空间分布数据集(1990-2022)

4年间隔的遥感信息提取中国沿海水产养殖空间分布数据集&#xff08;1990-2022&#xff09; 人口增长引起水产品需求快速增加&#xff0c;而野生捕捞产量受环境承载力的限制趋于饱和&#xff0c;这使得水产养殖业在过去数十年间迅速发展。水产养殖能够有效保障人类粮食安全和营养…

使用elementUI的form表单和Steps步骤条如何让rules分步骤校验

使用rules如何分步骤校验 一般如果我们使用form表单的时候都会用到rules来进行校验,那么如果加上步骤的应该如何校验呢? 我使用的方式是通过active 我们步骤1的时候 active是0, 步骤2的时候active是1 那我们在进行校验步骤1可以这样子写: :prop"active 0 ? title : …