第五章 表达式基础与详述

第1节 基础:引入

表达式由一到多个操作数组成,可以求值并(通常会)返回求值结果(函数的调用是一种表达式,有时函数不会返回求值结果)

  • 最基本的表达式:变量、字面值

  • 通常包含操作符(运算符)

操作符的特性

  • 接收操作数个数:一元、二元、三元

  • 操作数的类型

  • 操作数是左值还是右值

  • 结果的类型

  • 结果是左值还是右值

  • 优先级和结合性 Operator precedence and associativity(C++ reference)可以通过小括号来改变结合顺序和优先级

  • 操作符的重载,不改变操作数、优先级、结合性

操作符的求值顺序的不确定性

fun(x=x+1,x=x+1); 函数的两个入口参数为两个表达式,这两个表达式的执行顺序是不确定的,与编译器的选择有关

第2节 基础:左值与右值

划分针对表达式,不是针对对象或数值

#mermaid-svg-sHJzrfYIi9E7tTr1 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-sHJzrfYIi9E7tTr1 .error-icon{fill:#552222;}#mermaid-svg-sHJzrfYIi9E7tTr1 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-sHJzrfYIi9E7tTr1 .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-sHJzrfYIi9E7tTr1 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-sHJzrfYIi9E7tTr1 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-sHJzrfYIi9E7tTr1 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-sHJzrfYIi9E7tTr1 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-sHJzrfYIi9E7tTr1 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-sHJzrfYIi9E7tTr1 .marker.cross{stroke:#333333;}#mermaid-svg-sHJzrfYIi9E7tTr1 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-sHJzrfYIi9E7tTr1 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-sHJzrfYIi9E7tTr1 .cluster-label text{fill:#333;}#mermaid-svg-sHJzrfYIi9E7tTr1 .cluster-label span{color:#333;}#mermaid-svg-sHJzrfYIi9E7tTr1 .label text,#mermaid-svg-sHJzrfYIi9E7tTr1 span{fill:#333;color:#333;}#mermaid-svg-sHJzrfYIi9E7tTr1 .node rect,#mermaid-svg-sHJzrfYIi9E7tTr1 .node circle,#mermaid-svg-sHJzrfYIi9E7tTr1 .node ellipse,#mermaid-svg-sHJzrfYIi9E7tTr1 .node polygon,#mermaid-svg-sHJzrfYIi9E7tTr1 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-sHJzrfYIi9E7tTr1 .node .label{text-align:center;}#mermaid-svg-sHJzrfYIi9E7tTr1 .node.clickable{cursor:pointer;}#mermaid-svg-sHJzrfYIi9E7tTr1 .arrowheadPath{fill:#333333;}#mermaid-svg-sHJzrfYIi9E7tTr1 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-sHJzrfYIi9E7tTr1 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-sHJzrfYIi9E7tTr1 .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-sHJzrfYIi9E7tTr1 .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-sHJzrfYIi9E7tTr1 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-sHJzrfYIi9E7tTr1 .cluster text{fill:#333;}#mermaid-svg-sHJzrfYIi9E7tTr1 .cluster span{color:#333;}#mermaid-svg-sHJzrfYIi9E7tTr1 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-sHJzrfYIi9E7tTr1 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}

expression
glvalue
rvalue
lvalue
xvalue
prvalue

左右值的转化

  • 左值可以转换为右值
  • 临时具体化

第3节 基础:类型转换

操作符要求其操作数具有特殊的类型,或具有相同类型

隐式类型转换

  • 自动发生
  • 实际上是一个有限长度的转型序列

显式类型转换

  • 显式引入

  • static_cast<double>(3) + 0.5; 静态,编译器执行,性能较好但安全性较差

  • const_cast

  • dynamic_cast

  • reinterpret_cast

  • C形式的类型转换(尝试上述C++形式的类型转换,有一种可以执行则返回,不建议使用,因为不可控进行哪种转换,程序不够安全

C++不鼓励多使用显示类型转换,使用有风险

第4节 详述:算术操作符

三个优先级

  • + - (一元)

  • * / %

  • + - (二元)

均为左结合

通常操作数和结果数均为算数类型的右值,但+ -与一元+均可接收指针

一元+操作符会产生 integral promotion

short x = 3;
auto  y = x;       //y short
auto  z = +x;      //z int  (integral promotion)

整数相除产生整数,向0取整

求余只接受整数作为操作数

满足(m / n)* n + m % n == m

第5节 详述:逻辑与关系操作符

C++ Operator

关系操作符接收算术或指针类型操作数,逻辑操作符接收可转换为bool值的操作数

操作数和结果均为右值

除逻辑非,外其他操作符都是左结合的

逻辑与、逻辑或有短路特性

逻辑与的优先级高于逻辑或

通常来说不能将多个操作符串联

int a = 3;
int b = 4;
int c = 5;
c > b > a;    // true>a -->  1>a   返回0

spaceship操作符<=> (C++20)

if(a>b){ }
else if(a<b){ }
else{ }              // 比较a和b两次,如果a和b是比较复杂的数据结构,则性能较低
auto res = (a<=>b);
if(res==std::strong_ordering::g){ }
else(res==std::strong_ordering::less){ }
else{ }              //引入spaceship操作符,提升性能

避免value == true

第6节 详述:位操作符

接收右值,进行位运算,返回右值

除取反外,其他运算符均为左结合

计算过程中可能涉及integral promotion

unsigned char x = 0xff;  //11111111
auto y = ~x;             //整形提升成int类型 00...0011111111//按位取反得到      11...1100000000  -256
signed char x = 0xff;
auto y = ~x;             //整形提升成int类型 由于是signed 补符号位//                11...1111111111//按位取反得到      00...0000000000  0

没有短路逻辑

一定情况下等于乘除以2的幂,但速度更快

右移可以保持符号(补最高位),左移不能保证

计算机内带符号数据的存储方式

正数:直接用原码表示

复数:用其正值的补码表示,即其正值的原码取反码再加1

第7节 详述:赋值操作符

左操作数为可修改左值;右操作数为右值,可以转换为左操作数类型

赋值操作右结合的

求值结果为左操作数

可以引入大括号防止收缩转换(报错)

short x = {0x80000003}; 超出长度,报错

复合赋值运算符

x = x + 2; //赋值操作运算符优先级低于加法运算符

第8节 详述:自增自减运算符

++ --

有后缀和前缀两种形式

int x = 3;
int y = x++;     //y = 3   x = 4
int z = ++x;     //z = 5   z = 5    前缀优先于赋值语句

操作数为左值,前缀返回左值,后缀返回右值

建议使用前缀形式

第9节 详述:其他操作符

成员访问操作符.->,

  • ->等价于(*).
  • .左操作数为左值,则返回左值,左操作数为右值,返回值也为右值
  • ->左操作数为指针,返回值为左值

条件操作符

  • 唯一三元操作符

  • 接收一个可转化为bool类型的表达式和两个类型相同的操作数或表达式

  • ture ? (x++) : (y++);

  • 右结合

    int res = (res>0) ? 1 : (res<0) ? -1 : 0 ;

逗号操作符

  • 确保操作数从左到右求值

  • 返回结果最右侧的操作数

  • 左结合

  • void fun (int a,int b);此处逗号不是逗号操作符

sizeof操作符

操作数可以为类型或表达式

不实际求值,返回相应尺寸

其他操作符

域解析操作符 ::

函数调用操作符()

索引操作符[]

抛出异常操作符 throw

C++基础:第五章 表达式基础与详述相关推荐

  1. 【正点原子STM32连载】第五章 STM32基础知识入门 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1

    1)实验平台:正点原子MiniPro H750开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=677017430560 3)全套实验源码+手册+视频 ...

  2. 《我的眼睛--图灵识别》第五章:基础:形状识别

    <我的眼睛–图灵识别>第五章:基础:形状识别 1.图形认识 三角形 三角形是由同一平面内不在同一直线上的三条线段'首尾'顺次连接所组成的封闭图形. 三角形按边分有不等边三角形.等腰三角和等 ...

  3. 《计算机应用基础》第05章在线测试,计算机应用基础.第五章测试及答案.doc

    计算机应用基础.第五章测试及答案 <计算机应用基础>第05章在线测试及答案 ?<计算机应用基础>第05章在线测试 剩余时间: 59:05 第一题.单项选择题(每题1分,5道题共 ...

  4. 计算机应用基础第五章试题及答案,计算机应用基础第五章测试题

    计算机应用基础第五章单元测试卷 考试时间:60分钟 总分:100分 一.单选题(每小题3分,共20题,计60分) 1.PowerPoint中,显示出当前被处理的演示文稿文件名的栏是( ) [A]工具栏 ...

  5. 郑大计算机应用基础试题5章,郑大计算机应用基础第五章答案

    郑大计算机应用基础第五章答案 (3页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 8.90 积分 1.如果要从第 2 张幻灯片跳转到第 8 张幻灯片,应使 ...

  6. 微型计算机基础 教案,第一章微型计算机基础知识新080902电子教案(153页)-原创力文档...

    第一章 微型计算机基础知识;第一章? 微型计算机基础知识;§1.1 计算机中数的表示方法;1.1.1 进位计数制及各计数制间的转换;二进制数的特点; 十进制--符合人们的习惯二进制--便于物理实现十六 ...

  7. JavaSE入门0基础笔记 第二章Java基础语法

    JavaSE入门0基础笔记 第二章Java基础语法 1.运算符 1.1算术运算符 1.1.1运算符和表达式 1.1.2 算术运算符 1.1.3字符的"+"操作 1.1.4 字符串中 ...

  8. 计算机应用基础第2章相关知识,大学计算机应用基础第2章计算机基础知识.ppt

    大学计算机应用基础第2章计算机基础知识 2010-8-1 目 录 第1章 绪 论 第2章 计算机基础知识 第3章 计算机硬件系统 第4章 计算机操作系统 第5章 办公应用软件 第6章 多媒体技术应用 ...

  9. 计算机网络按信号频带占用方式,[大学计算机应用基础第六章计算机网络基础.ppt...

    [大学计算机应用基础第六章计算机网络基础 第六章 计算机网络基础 中国金桥信息网(CHINAGBN )由原电子工业部归口管理,它是一个把国务院.各部委专用网络与各省市自治区.大中型企业以及国家重点工程 ...

  10. 计算机基础应用000018,计算机应用基础第01章计算机基础知识

    计算机应用基础第01章计算机基础知识 (30页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 14.90 积分 计算机应用基础 任务描述 小明是大一新生,目 ...

最新文章

  1. 终于有人把计算机视觉讲明白了
  2. 用简单的C语言实现多任务轮流切换(模拟操作系统线程机制)【转】
  3. 字节二面,让写一个LFU缓存策略算法,懵了
  4. python高斯滤波和降噪_python添加高斯噪声和椒盐噪声,实现中值滤波和均值滤波,实现Roberts算子和Sobel算子...
  5. SAP打补丁时需要注意的地方
  6. DotNetNuke出错:“Runat 属性必须具有值 Server(The Runat attribute must have the value Server Error)...
  7. java怎么从一个类传值到另一个类_Android开发之两个类之间的数据传递
  8. python测试框架untest怎么循环执行_unittest如何在循环遍历一条用例时生成多个测试结果...
  9. mysql 拒绝访问的解决办法
  10. 路由器互通过程(简述)
  11. 如何编写一份优质的可行性研究报告
  12. 第一次在CSND做记录,关于linux修改文件的最后访问时间。
  13. 音乐推荐系统协同过滤算法解释
  14. 关于Vue中v-if 和 v-for一起使用
  15. 计算机应用与基础app,手机APP支持下《计算机应用基础》课程探究性学习活动设计与实验研究...
  16. buff系统 游戏中_泛娱产业:ARPG游戏的技能系统和buff系统的一种实现
  17. 数据的结构分类:结构化数据,半结构化数据以及非结构化数据
  18. mysql 查连接数,查看MySQL的连接数
  19. 把字符串中的全角数字替换成半角数字 0123456789 转换成 0123456789
  20. u-boot 顶层Makefile 分析

热门文章

  1. 关于PHOTO SHOP CS9.0无法启动adobe updater 请重新安装应用程序和组件解决方法!
  2. 回调函数c++类中实现
  3. MySQL 存储过程错误处理
  4. [WOJ2549]逻辑的连通性
  5. 你所不知道的 CSS 阴影技巧与细节
  6. Elasticsearch: 配置文件详解
  7. 跨域 webpack + vue-cil 中 proxyTable 处理跨域
  8. [deviceone开发]-土地销售App开源
  9. jq中的get()和eq()的区别
  10. 聊聊我在美团做算法的感受