C++基础知识要点--表达式 (Primer C++ 第五版 · 阅读笔记)

news2025/7/27 15:06:38

目录

    • 表达式
      • 基础
      • 算术运算符
      • 逻辑和关系运算符
      • 赋值运算符
      • 递增和递减运算符
      • 成员访问运算符
      • 条件运算符
      • 位运算符
      • sizeof运算符
      • 逗号运算符
      • 类运算符
      • 运算符优先级表

表达式

基础

  • 当一个对象被用作右值的时候,用的是对象的 (内容);
  • 当对象被用作左值的时候,用的是对象的 身份(在内存中的位置)。

求值顺序
对于那些没有指定执行顺序的运算符来说,如果表达式指向并修改了同一个对象,将会引发错误并产生未定义的行为。举个简单的例子,<<运算符没有明确规定何时以及如何对运算对象求值,因此下面的输出表达式是未定义的:

int i = 0 ;
cout << i << " " << ++i << endl;       //未定义的,i 和 ++i 不知道谁先求

以下两条经验准则对书写复合表达式有益:

  • 1.拿不准的时候最好用括号来强制让表达式的组合关系符合程序逻辑的要求。
  • 2.如果改变了某个运算对象的值,在表达式的其他地方不要再使用这个运算对象。

算术运算符

一元运算符的优先级最高,接下来是乘法和除法,优先级最低的是加法和减法。下面的所有运算符都满足左结合律,意味着当优先级相同时按照从左向右的顺序进行组合。
在这里插入图片描述
在表达式求值之前,小整数类型的运算对象被提升成较大的整数类型,所有运算对象最终会转换成同一类型。

一元负号运算符对运算对象值取负后,返回其(提升后的)副本:

// k是-1024
bool b = true;
bool b2 = -b;      // b2是true!

对大多数运算符来说,布尔类型的运算对象将被提升为int 类型。如上所示,布尔变量b的值为真,参与运算时将被提升成整数值1,对它求负后的结果是-1。将-1再转换回布尔值并将其作为b2的初始值,显然这个初始值不等于0,转换成布尔值后应该为1。所以,b2的值是真 !

逻辑和关系运算符

关系运算符作用于算术类型或指针类型,逻辑运算符作用于任意能转换成布尔值的类型。逻辑运算符和关系运算符的返回值都是布尔类型。值为0的运算对象(算术类型或指针类型)表示假,否则表示真。对于这两类运算符来说,运算对象和求值结果都是右值。
在这里插入图片描述
短路求值(short-circuit evaluation):

  • 对于逻辑与运算符来说,当且仅当左侧运算对象为真时才对右侧运算对象求值。
  • 对于逻辑或运算符来说,当且仅当左侧运算对象为假时才对右侧运算对象求值。

关系运算符

  • 关系运算符都满足左结合律

因为关系运算符的求值结果是布尔值,所以将几个关系运算符连写在一起会产生意想不到的结果:

//哎哟!这个条件居然拿i<j的布尔值结果和k比较!
if (i < j < k)         //若k 大于1则为真!

//正确:当i小于j并且j小于k时条件为真
if (i < j && j < k) {/* ...*/ }

相等性测试与布尔字面值

if (val) {/* ...*/ }           //如果val是任意的非0值,条件为真
if (!val) {/* ...*/ }         //如果val是0,条件为真

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

if (val == true){/* ...*/ }       //只有当val等于1时条件才为真!

但是这种写法存在两个问题:

  • 首先,与之前的代码相比,上面这种写法较长而且不太直接
  • 更重要的一点是,如果 val 不是布尔值,这样的比较就失去了原来的意义。

赋值运算符

递增和递减运算符

成员访问运算符

条件运算符

位运算符

sizeof运算符

逗号运算符

类运算符

运算符优先级表

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

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

相关文章

Linux 信号

概念&#xff1a;信号不是信号量&#xff0c;信号量是进程间的一种通信方式&#xff0c;信号是系统中的软件中断&#xff0c;指一种事件通知机制&#xff0c;通知进程发生了某个事件&#xff0c;打断当前的操作&#xff0c;去处理这个事件。 种类&#xff1a;一共有62种信号&a…

Linux之用户管理、权限管理、程序安装卸载

一. 用户管理 1. 查看账户 (1). 查看当前账号&#xff1a;whoami ​​(2). 查看系统当前登录的账号&#xff1a;who ​​补充常用选项&#xff1a; ​​(3). 查看系统所有的账号&#xff1a; cat /etc/passwd ​​2. exit&#xff1a;退出登录账户 如果是图形界面&#xff0c…

curl命令的常用操作

curl是非常实用的命令行工具&#xff0c;用来与服务器之间传输数据。它的命令行参数多达几十种。 在Linux环境中使用curl命令可以进行接口测试。利用curl对http协议发送Get/Post/Delete/Put请求,同时还可以携带header来满足接口的特定需求。 curl命令的语法 curl[options] [U…

Linux03-网络设置

一、说明 在上一节&#xff0c;咱使用VMware安装了虚拟机&#xff0c;网络设置选择了 “桥接模式” &#xff0c;本节咱们来具体讨论一下网络连接方式和网络设置。 实验环境&#xff1a;CentOS7 VMware 二、桥接模式 当我们设置桥接模式时&#xff0c;虚拟机是直接使用物理…

eNSP出现错误,错误代码40暴力解决方案

如果你和我一样&#xff0c;在eNSP中启动一个设备时发生了错误&#xff0c;错误代码为40&#xff0c;那么这篇文件可能会帮助你。 首先你可以仔细地按照这篇说明中的做法进行操作&#xff0c;如果你电脑也是win10&#xff0c;并且之前没有安装过wireshark&#xff0c;virtualb…

后端总说他啥也没动,我从线上调了一下测试接口,你再说一句动没动

◇ 不知道广大前端同学有没有过这样的经历&#xff0c;在做新需求联调的时候&#xff0c;原本上一个版本已经做的好好的功能&#xff0c;前后端已经联调好的。这次做需求的时候&#xff0c;测试发现好多地方都不对了。 ◇ 开发人员经常说的一句话就是&#xff1a;我啥也没动啊…

Java -- 每日一问:你了解Java应用开发中的注入攻击吗?

典型回答 注入式&#xff08;Inject&#xff09;攻击是一类非常常见的攻击方式&#xff0c;其基本特征是程序允许攻击者将不可信的动态内容注入到程序中&#xff0c;并将其执行&#xff0c;这就可能完全改变最初预计的执行过程&#xff0c;产生恶意效果。 下面是几种主要的注…

Web前端:2022年Web开发者的五大CSS工具

据相关数据统计&#xff0c;2018年至2028年&#xff0c;网络开发人员的就业预计将增长13%&#xff0c;这意味着网站开发者的需求量很大&#xff0c;而企业需要专业人员来构建网站&#xff0c;而高效制作优秀网站的最佳方法是拥有最好的web开发工具。 对优秀web开发工具的需求使…

设信号x(t)=cos(2π×50t)+2×cos(2π×400t),试将它的两个频率分量分离,并绘制它们的时域波形及频谱图

以下程序无需赋值&#xff0c;直接运行即可&#xff1a; &#xff08;已验证可以运行&#xff09; function [yl,yh]shiyan49 fs1600; %采样频率 Tt0.02; %信号周期 T04*Tt; %记录长度 [xn,wk,N]shiyan40(fs,T0); Mlength(wk); if M2 rp1;rs80; f1wk(1)*fs/N; f2wk(2…

升余弦滤波器的FPGA实现

目录 升余弦滤波器与无码间串扰&#xff08;一&#xff09; 升余弦滤波器与无码间串扰&#xff08;二&#xff09; 升余弦滤波器的FPGA实现 一、FIR ip核 成形滤波器采用vivado中的FIR ip核实现。滤波器的系数用matlab产生并转成coe文件。 wire m_axis_data_tvalid; rcos_f…

官网下载JAVA的JDK11版本(下载、安装、配置环境变量)

目录 前言&#xff1a; 一、下载JDK11 1.先去浏览器搜索 2.选择Products 3.Java ​编辑 4.往下滑找到Oracle JDK,然后点击 5.往下滑找到Java11&#xff0c;再选择自己的操作系统 6.选择exe这个直接安装的后缀 7.跳出来的弹窗勾选&#xff0c;并点击 8.弹出来一个甲骨文…

树莓派4b linux内核调试(jtag、kgdb)

1、-O0编译树莓派4b linux内核(linux-5.10.95) 内核源码分支: https://github.com/raspberrypi/linux/tree/rpi-5.10.y 参考其他网站&#xff0c;注释掉arch/arm64/include/asm/jump_label.h文件里面的内联汇编分支&#xff1b; 修改arch/arm64/include/asm/memory.h里面的MIN…

大一学生Web课程设计 美食主题网页制作(HTML+CSS+JavaScript)

&#x1f380; 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

传奇开服教程——传奇微端架设教程-GEE引擎

登录器和网站配置好后&#xff0c;我们进入游戏后会发现是黑屏的&#xff0c;更新不了地图和NPC这些&#xff0c;因为还没有做微端&#xff0c;会黑屏也是正常的。 有些GEE版本有配套的微端程序&#xff0c;有些版本没有&#xff0c;需要自己去gee官网下载更新时间比引擎还靠后…

多层固定分组计算

【问题】 I want to build opening closing report – ITEM_TRANSACTION TABLE- Consider below data– 1.When item is prepared entry is made into table wih NULL indicator.. 2. When Item is issued/sold entry is made into table with ISSUE indicator Date Iname I…

[附源码]SSM计算机毕业设计中学学生学籍管理JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

笔试强训第29天

单选 A选项&#xff1a;当内存访问越界的时候&#xff0c;线程会收到信号&#xff0c;进而进行信号处理。调用信号处理函数。 B选项&#xff1a;ACM时间。 A&#xff1a;最后访问时间&#xff0c;文件被读取而更新的时间 C&#xff1a;状态修改时间&#xff0c;文件的属性或者权…

遨博机械臂URDF功能包ROS仿真

文章目录知识目标1.机械臂URDF功能包文件结构2.URDF模型中的元素和参数3.任务描述3.1 修订launch启动文件参数3.2 URDF功能包编译知识目标 学习机械臂URDF功能包文件结构 掌握机械臂URDF模型文件各元素和参数概念 1.机械臂URDF功能包文件结构 2.URDF模型中的元素和参数 机械…

【mmDetection框架解读】入门篇三、VOC数据集转COCO数据集,在MMDetection中成功运行

目录一、voc数据集转coco数据集二、修改配置二、验证数据集是否转换成功相关源码文件一、voc数据集转coco数据集 执行命令&#xff1a; python tools/dataset_converters/pascal_voc.py ../../../data/devkit ../../../data/coco通过VOC的xml文件生成COCO的json标签文件。 再…

Linux下延时一定时间,又不挂起程序。

0.前言 这是一个解决篇Linux C语言怎么实现通过socket发送一秒数据&#xff0c;上次想要实现做一秒的事情没有写出来&#xff0c;这次解决掉。先推荐一部电影《猩球崛起》三部曲。 1.Linux下的sleep函数。 这个函数的确可以起到延时的作用&#xff0c;但是他会把整个进程挂起&a…