深蓝学院C++基础与深度解析笔记 第 5 章 语句

1. 语句基础

● 语句的常见类别

– 表达式语句:表达式后加分号,对表达式求值后丢弃,可能产生副作用
– 空语句:仅包含一个分号的语句,可能与循环一起工作
– 复合语句(语句体):由大括号组成,无需在结尾加分号,形成独立的域(语句域)
分号:标志语句的结束

顺序语句与非顺序语句

– 顺序语句
● 从语义上按照先后顺序执行
● 实际的执行顺序可能产生变化(编译器优化、硬件乱序执行)
● 与硬件流水线紧密结合,执行效率较高
– 非顺序语句:选择 | 循环 | goto
● 在执行过程中引入跳转,从而产生复杂的变化
● 分支预测错误可能导致执行性能降低

● 最基本的非顺序语句: goto

– 通过标签指定跳转到的位置
– 具有若干限制
● 不能跨函数跳转
● 向前跳转时不能越过对象初始化语句
– 向后跳转可能会导致对象销毁与重新初始化
● goto 本质上对应了汇编语言中的跳转指令
– 缺乏结构性的含义
– 容易造成逻辑混乱
– 除特殊情况外,应避免使用,非必要 不要写这种shit!

2. 分支语句

1、if else: 语法
● 使用语句块表示复杂的分支逻辑
● 从 if 到 if-else
– 实现多重分支
– else 会与最近的 if 匹配
– 使用大括号改变匹配规则,没有大括号只执行下一行
● if V.S. constexpr if—— 运行期与编译期分支
● 带初始化语句的 if:c++ 17以后
在这里插入图片描述

2、switch{}: 语法
● 条件部分应当能够隐式转换为整形或枚举类型,可以包含初始化的语句
C++17:
在这里插入图片描述

● case/default 标签

– case 后面跟常量表达式 , 用于匹配 switch 中的条件,匹配时执行后续的代码
– 可以使用 break 跳出当前的 switch 执行,记得break,一般每一个分支都加,最后一个也加
– default 用于定义缺省情况下的逻辑
– 在 case/default 中定义对象要加大括号 { },
●[[fallthrough]] 属性:代替break,但是不跳出

● 与 if 相比的优劣

– 分支描述能力较弱,需要列举
– 在一些情况下能引入更好的优化

3. 循环语句

A、while() : 语法

● 处理逻辑:
– 1. 判断条件是否满足,如果不满足则跳出循环
– 2. 如果条件满足则执行循环体
– 3. 执行完循环体后转向步骤 1
● 注意:

while 的条件部分不包含额外的初始化内容  
while();是一个死循环

B、do-while: 语法

– 注意结尾处要有分号,表示一条语句的结束
● 处理逻辑:
– 1. 执行循环体
– 2. 断条件是否满足,如果不满足则跳出循环
– 3. 如果条件满足则转向步骤 1

C、for: 语法

for ( int v:arr) { 
    cout<<v<<endl;
}

● 处理逻辑
– 1. 初始化语句会被首先执行
– 2. 条件部分会被执行,执行结果如果为 false ,则终止循环
– 3. 否则执行循环体
– 4. 迭代表达式会被求值,之后转向 2
● 在初始化语句中声明多个名字
● 初始化语句、条件、迭代表达式可以为空
● for 的更多示例

D、基于范围的 for 循环: 语法:
● 本质:语法糖,编译器会转换为 for 循环的调用方式
● 转换形式的衍化: C++11 / C++17 / C++20
● 使用常量左值引用读元素;使用 万能引用( “ universal reference )”修改元素

4. 语句的综合应用——达夫设备

● 使用循环展开提升系统性能
● 处理无法整除的情形
– 额外增加一个循环语句
– 将 switch 与循环结合 —— 达夫设备
课件讲的没听懂,以下from chatgpt:
在C++中,“达夫设备”(Duff’s device)是一种优化技术,用于加速循环的执行。它是由程序员Tom Duff在1983年提出的,并被广泛使用于C语言和C++中。

达夫设备的主要思想是利用了C语言的"跳跃表达式"(jump table)和"case"语句的结合来实现循环的并行执行。这种技术主要用于在处理大量数据的情况下提高程序的执行效率。

达夫设备的一般实现方式如下:

unsigned count = N;
unsigned n = (count + 7) / 8;

switch (count % 8) {
    case 0: do { 
        // 处理循环体语句
    } while (--n > 0);
    case 7: do { 
        // 处理循环体语句
    } while (--n > 0);
    case 6: do { 
        // 处理循环体语句
    } while (--n > 0);
    case 5: do { 
        // 处理循环体语句
    } while (--n > 0);
    case 4: do { 
        // 处理循环体语句
    } while (--n > 0);
    case 3: do { 
        // 处理循环体语句
    } while (--n > 0);
    case 2: do { 
        // 处理循环体语句
    } while (--n > 0);
    case 1: do { 
        // 处理循环体语句
    } while (--n > 0);
}

这段代码使用了一个switch语句来检查循环次数的余数(count % 8),然后根据不同的余数执行不同的循环体语句,直到计数器n减少为0。通过这种方式,可以实现循环的并行执行,提高程序的效率。

需要注意的是,达夫设备是一种特定的优化技术,使用时需要谨慎。在现代编译器中,通常会进行更复杂的优化,因此达夫设备可能并不总是比编译器生成的代码更高效。此外,达夫设备的使用也可能降低代码的可读性和可维护性,因此在实际开发中应权衡利弊并慎重选择是否使用。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

电商数仓(用户行为采集平台)数据仓库概念、用户行为日志、业务数据、模拟数据、用户行为数据采集模块、日志采集Flume

1、数据仓库概念 数据仓库&#xff08; Data Warehouse &#xff09;&#xff0c;是为企业制定决策&#xff0c;提供数据支持的。可以帮助企业&#xff0c;改进业务流程、提高产品质量等。 数据仓库的输入数据通常包括&#xff1a;业务数据、用户行为数据和爬虫数据等。 业务数…

流场粒子追踪精度数值实验

在计算流线&#xff0c;拉格朗日拟序结构等流场后处理时&#xff0c;我们常常需要计算无质量的粒子在流场中迁移时的轨迹&#xff0c;无质量意味着粒子的速度为流场当地的速度。此时&#xff0c;求解粒子的位移这个问题是一个非常简单的常微分方程问题。 假设流场中存在 i 个粒…

Java版本+企业电子招投标系统源代码之电子招投标系统建设的重点和未来趋势

计算机与网络技术的不断发展&#xff0c;推动了社会各行业信息化的步伐。时至今日&#xff0c;电子政务、电子商务已经非常普及&#xff0c;云计算、大数据、工业4.0、“互联网”等发展理念也逐步深入人心&#xff0c;如何将传统行业与互联网科技有效结合起来&#xff0c;产生1…

Vue实现元素沿着坐标数组移动,超出窗口视图时页面跟随元素滚动

一、实现元素沿着坐标数组移动 现在想要实现船沿着下图中的每个河岸移动。 实现思路&#xff1a; 1、将所有河岸的位置以 [{x: 1, y: 2}, {x: 4, y: 4}, …] 的形式保存在数组中。 data() {return {coordinateArr: [{ x: 54, y: 16 }, { x: 15, y: 31 }, { x: 51, y: 69 }…

升级Nginx

目录 前言 一、升级Nginx 1&#xff09;首先在官网下载一个新版本的Nginx 2&#xff09;首先将下载的压缩包进行解包 3&#xff09;进入已解包的目录中 4&#xff09;配置安装路径 5&#xff09;make 6&#xff09;备份原来Nginx的资源 7&#xff09;重启Nginx服务 8&#…

【2023最全教程】Web自动化测试怎么做?Web自动化测试的详细流程和步骤

一、什么是web自动化测试 自动化&#xff08;Automation&#xff09;是指机器设备、系统或过程&#xff08;生产、管理过程&#xff09;在没有人或较少人的直接参与下&#xff0c;按照人的要求&#xff0c;经过自动检测、信息处理、分析判断、操纵控制&#xff0c;实现预期的目…

毕业季Android开发面试,有哪些常见的题?

前言 对于计算机行业早已烂大街&#xff0c;随之而来的毕业季。还会有大批的程序员涌进来&#xff0c;而我们想要继续进入Android开发岗位的人员&#xff0c;最先考虑的是面试。面试题是我们决定踏进工作的重要环节。 对于刚毕业的实习生来说&#xff0c;如何在应聘中脱颖而出…

LightningChart .NET 10.5.1 Crack LightningChart 2023

LightningChart .NET v.10.5.1 已经发布&#xff01; DataCursor 和 3D TransparencyRenderMode 现在可用。 为所有 3D、Polar 和 Smith 系列启用 DataCursor 在早期阶段&#xff0c;LightningChart 提供了不同的工具&#xff0c;需要用户编写额外的代码才能启用数据跟踪功能。…

控制您的数据:Web3私有链为数据主权带来的突破性变革

在数字化时代&#xff0c;数据已经成为企业和个人最宝贵的资产之一。然而&#xff0c;随着大规模数据泄露和滥用事件的频发&#xff0c;数据主权和隐私保护成为了备受关注的问题。在这个背景下&#xff0c;Web3私有链的出现为数据主权带来了一场突破性的变革。 首先&#xff0c…

风景类Midjourney prompt提示词

稳定输出优美风景壁纸的Midjourney prompt提示词。 1\在夏夜&#xff0c;有淡蓝色的星空&#xff0c;海边&#xff0c;流星&#xff0c;烟花&#xff0c;海滩上全是蓝色的玫瑰和绿色的植物&#xff0c;由Ivan Aivazovsky和Dan Mumford&#xff0c;趋势在cgsociety&#xff0c;…

windows2022证书配置.docx

Windows证书的配置 要求两台主机&#xff0c;一台作为域&#xff0c;一台进入域 按要求来选择角色服务 确认之后安装 安装完以后配置证书服务 选择服务 按要求配置 注&#xff1a;此处不用域用户登陆无法使用企业CA 按要求来 创建新的私钥 这几处检查无误后默认即可 有效期…

AJAX概述

1.1什么是AJAX. Ajax即AsynchronousJavascript And XML&#xff1a;异步数据回调。 使用Ajax技术网页应用能够快速地将更新呈现在用户界面上&#xff0c;不需要重载&#xff08;刷新&#xff09;整个页面【只刷新局部】&#xff0c;这使得程序能够更快地回应用户的操作。、 1…

2023年5月青少年机器人技术等级考试理论综合试卷(四级)

青少年机器人技术等级考试理论综合试卷&#xff08;四级&#xff09;2023.6 分数&#xff1a; 100 题数&#xff1a; 30 一、 单选题(共 20 题&#xff0c; 共 80 分) 1.Arduino C 语言&#xff0c; 部分程序如下&#xff0c; 串口监视器输出结果是“D”时&#xff0c; 变量 i …

【集群】Haproxy搭建Web群集

文章目录 一、Haproxy 相关概念1. Haproxy 的概述2. Haproxy 的主要特性3. 常见的 Web 集群调度器4. 常见的应用分析4.1 LVS 应用4.2 Haproxy 应用4.3 LVS、Nginx、Haproxy的区别 5. Haproxy 调度算法原理5.1 roundrobin5.2 static-rr5.3 leastconn5.4 source5.5 uri5.6 url_pa…

SpringBoot + Vue前后端分离项目实战 || 二:Spring Boot后端与数据库连接

系列文章&#xff1a; SpringBoot Vue前后端分离项目实战 || 一&#xff1a;Vue前端设计 文章目录 新建Spring后台项目添加依赖 新建数据库IDEA 连接数据库IDEA 自动创建类实体定义数据传递至前端的格式 B站视频讲解&#xff1a;2023全网最简单但实用的SpringBootVue前后端分离…

RTC

文章目录 前言驱动应用程序运行 前言 RTC&#xff08;Real Time Clock&#xff0c;实时时钟&#xff09;是个常用的外设&#xff0c;通过 RTC 我们可以知道日期和时间信息&#xff0c;因此在需要记录时间的场合就需要实时时钟。 可以使用专用的实时时钟芯片来完成此功能&#…

扫雷小游戏【C语言】

目录 前言 一、基本实现逻辑 二、实现步骤 1. 我们希望在进入游戏时有一个菜单让我们选择 2. 我们希望可以重复的玩&#xff08;一把玩完了还可以接着玩&#xff09; 3. 采用多文件形式编程 4.要扫雷先得有棋盘&#xff08;创建棋盘R*N&#xff09; 5.初始化棋盘 6.打…

【网络安全】深入解析 PHP 代码审计技术与实战

前言 登录某个网站并浏览其页面时&#xff0c;注意到了一些看起来不太对劲的地方。这些迹象可能是该网站存在漏洞或被黑客入侵的标志。为了确保这个网站的安全性&#xff0c;需要进行代码审计&#xff0c;这是一项专门针对软件代码进行检查和分析的技术。在本文中&#xff0c;…

一、Docker介绍

学习参考&#xff1a;尚硅谷Docker实战教程、Docker官网、其他优秀博客(参考过的在文章最后列出) 目录 前言一、Docker是什么&#xff1f;二、Docker能干撒&#xff1f;三、容器虚拟化技术 和 虚拟机有啥区别&#xff1f;1.虚拟机2.容器虚拟化技术3.对比4.Docker为啥比VM虚拟机…

献给蓝初小白系列(二)——Liunx应急响应

1、Linux被入侵的症状​​ ​​https://blog.csdn.net/weixin_52351575/article/details/131221720​​ 2、Linux应急措施 顺序是&#xff1a;隔离主机--->阻断通信--->清除病毒--->可疑用户--->启动项和服务--->文件与后门--->杀毒、重装系统、恢复数据 …