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

news2025/5/19 4:40:42

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。通过这种方式,可以实现循环的并行执行,提高程序的效率。

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

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

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

相关文章

软考A计划-系统集成项目管理工程师-信息系统集成及服务管理体系

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff…

Flutter Dart 变量和内置类型

目录 一、变量 1.1 var 1.2 Object 1.3 dynamic 1.4 final与const 二、内置类型 2.1 num&#xff08;数值&#xff09; 2.2 Strings&#xff08;字符串&#xff09; 2.3 bool&#xff08;布尔值&#xff09; 2.4 List&#xff08;列表&#xff09; 2.5 Map&#xff08;映射集…

Android apk 反编译后打包(含签名)

想分析某些app源码时&#xff0c;遇到烦人弹框&#xff0c;现在想反编译看看具体实现。 用到的工具: GDA4.06 apk反编译工具 apktool apk 打包工具 jdk 环境 一、反编译分析 将apk反编译打开 找到入口代码 弹框代码如图 二、解包、打包 使用apktool解包 ps: apktool工具…

unity游戏架构设计

1.unity架构的3个等级 EmptyGO 所有功能写一个脚本挂载object上面&#xff0c;没有单列manager。 Simple GameManager 写一个公用的管理器&#xff0c;方便调用 Manager of Managers 不同的类型的东西用不同的管理器【声音管理器&#xff0c;关卡管理器&#xff0c;】 2…

chatgpt赋能python:Python搜索快捷键

Python搜索快捷键 介绍 Python作为一门广泛应用在各个领域的编程语言&#xff0c;其强大的搜索功能也得到了广泛的应用和赞誉。但是&#xff0c;在日常的使用中&#xff0c;有时我们需要进行大量的搜索和筛选操作&#xff0c;这时候掌握一些Python搜索快捷键将能够极大地提高…

java入门2(运算符)

目录 运算符和C语言基本一样 算术运算符 单目运算符&#xff1a;自增自减运算符 比较运算符 逻辑运算符 位运算符&#xff08;C语言好像没有&#xff09; 优先级 交换算法 运算符和C语言基本一样 算术运算符 比如拆分一个三位数 public class java练习代码 {public…

Cortext-M3系统:NVIC与中断控制(4)

1、NVIC概述 向量中断控制器&#xff0c;简称NVIC&#xff0c;是Cortex-M3不可分离的一部分&#xff0c;它与CM3内核的逻辑紧密耦合。NVIC的寄存器以存储器映射的方式来访问&#xff0c;除了包含控制寄存器和中断处理的控制逻辑之外&#xff0c;NVIC还包含了MPU、SysTick定时器…

算法分析01--算法的基本概念

1.算法设计与分析的基本概念 1.1算法 算法(Algorithm)是对特定问题求解步骤的一种描述&#xff0c; 它是指令的有限序列&#xff0c; 其中每一条指令表示一个或多个操作。 算法具有以下5个重要特性&#xff1a; 1.有穷性 一个算法必须在有穷步内完成&#xff0c;并且每一步…

Vue2 到 Vue3, 5 个常用API的变化有哪些

Vue3之于Vue2最大的变化&#xff0c;当属composition API了&#xff0c;而除了引入composition API外&#xff0c;一些我们在Vue2上经常使用的东西到了Vue3时也发生了不小的变化&#xff0c;本文将介绍一些有Vue2到Vue3中几个比较重要且常用的知识点&#xff0c;欢迎感兴趣的同…

学习adaboost(一,遍历分类器,c#实现)

我看了很多遍&#xff0c;终于搞懂了&#xff0c;现在编程试一试&#xff0c; 参考文献&#xff08;十三&#xff09;通俗易懂理解——Adaboost算法原理 - 知乎 (zhihu.com) 先写一一段代码&#xff0c;把这个数据集里头的所有分类器找出来&#xff1a;一共四种结果&#xff1a…

C++基础(4)——类和对象(2)

前言 本文主要介绍了C中类和对象的基本知识。 4.2.5&#xff1a;深拷贝和浅拷贝 浅拷贝&#xff1a;编译器给我们提供的拷贝函数就是等号复制操作 深拷贝&#xff1a;自己手动重写一个拷贝构造函数&#xff0c;重新new 浅拷贝会出现的问题&#xff1a;如果使用编译器提供的…

CSS3-背景

背景 1 背景颜色 2 背景图片 3 背景平铺 4 背景位置 5 背景相关属性连写 6&#xff08;拓展&#xff09;img标签和背景图片的区别 1 背景颜色 属性名&#xff1a;background-color 取值&#xff1b;关键字、rgb表示法、rgba表示法、十六进制 注意&#xff1a; 1 背景颜色默认值…

基于Java中小企业人力资源管理系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a; ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精…

CSS查缺补漏之《常用文本属性、列表属性、表格属性、鼠标属性》

文本属性 letter-spacing&#xff1a; 表示字母或汉字间距&#xff1b; word-spacing&#xff1a;表示单词之间或汉字之间空格的间距 <div>Loremip sumdolors itametconsecteturadipisicingelit.Voluptas.</div> <div>这是一首简单的小情歌 唱着我们心肠的曲…

chatgpt赋能python:Python数据归一化:什么是数据归一化及其作用

Python数据归一化&#xff1a;什么是数据归一化及其作用 数据归一化是一个在数据分析中经常出现的术语。其目的是将数据缩放到相同的比例&#xff0c;从而进行更加准确和可靠的分析。在本文中&#xff0c;我们将介绍什么是数据归一化&#xff0c;为什么我们需要它以及如何在Py…

Element-ui 滚动条美化

目录 1、缘起 2、实际示例 3、美化滚动条 4、Element-plus中的滚动条 5、关于实现方式的思考 1、缘起 之前在做项目时&#xff0c;发现一个项目中&#xff0c;各个子应用项目的UI表现不一致&#xff0c;看了下式Vue项目滚动条和其他的子应用项目表现明显不一致。 有时候…

《网络安全0-100》网络安全前沿

1-人工智能和网络安全 人工智能和网络安全是两个不同的领域&#xff0c;但它 们之间存在着千丝万缕的联系和相互影响。下 面是一些人工智能和网络安全的联系和应用&#xff1a; 威胁检测和预测&#xff1a;人工智能可以利用机器学习 和深度学习等技术&#xff0c;对网络数据…

Golang每日一练(leetDay0103) 区域和检索1~3 Range Sum Query

目录 303. 区域和检索 - 数组不可变 Range Sum Query Immutable &#x1f31f; 304. 二维区域和检索 - 矩阵不可变 Range Sum Query 2d Immutable &#x1f31f;&#x1f31f; 307. 区域和检索 - 数组可修改 Range Sum Query Mutable &#x1f31f;&#x1f31f; &#…

kali配置静态IP地址

修改网络配置 执行命令&#xff1a; vim /etc/network/interfaces 文件末尾添加如下内容&#xff1a; auto eth0 iface eth0 inet static address 192.168.133.66 netmask 255.255.255.0 gateway 192.168.133.2其中&#xff0c;iface eth0 inet static 指配置eth0使用静态ip…

chatgpt赋能python:Python数据建模:从数据预处理到机器学习建模

Python数据建模&#xff1a;从数据预处理到机器学习建模 Python已经成为了数据建模与分析的主要工具之一&#xff0c;因为它的语法简单易懂&#xff0c;有许多数据科学库可以使用&#xff0c;支持各种各样的数据预处理和建模技术。在本文中&#xff0c;我们将重点介绍使用Pyth…