【C++】8.语句[深蓝学院C++第6章]

前言

 

一.语句基础

语句的常见类别

(1)表达式语句,以分号结尾,对表达式求值后丢弃,可能产生耗时副作用;

(2)空语句,如for循环中

(3)复合语句,由大括号组成,无需在结尾加分号,形成独立的域(语句域)

顺序语句与非顺序语句

(1)顺序语句按照先后顺序执行,实际的执行顺序可能因为优化而产生变化,与硬件流水线紧密结合,执行效率较高

(2)非顺序语句是在执行过程中引入跳转,从而产生复杂的变化,分支预测错误可能导致执行性能降低

最基本的非顺序语句goto:

(1)通过标签跳转到指定位置

(2)具有若干限制,不能跨函数跳转,向前跳转时不能越过对象初始化语句

(3)具有危险性,向后跳转时可能会导致对象销毁与重新初始化

(4)缺点,缺乏结构性定义,容易造成逻辑混乱,除特殊情况外应避免使用

二.分支语句

2.1if

if-else,分支逻辑

使用语句块表示复杂的逻辑

从if到if-else:

(1)实现多重分支

(2)else会与最近的if匹配,if——else if——else if——else,不要靠缩进来判定代码域

(3)使用大括号改变匹配规则

 if和constexpr if,运行期与编译器分支,使编译器引入更多的优化选择

带初始化语句的if,if(int y=x*3;y>100)//这样y就是一个临时变量

 2.2switch

条件部分应当能够隐式转换为整型或枚举类型,可以包含初始化语句,switch(int y=x;y)

case/default标签:

(1)case后面跟常量表达式,用于匹配switch中的条件,匹配时执行;

(2)可以使用break跳出当前的switch执行,不跳出则继续向下执行

(3)dafault用于标签不匹配时的缺省处理逻辑

(4)case/default中定义对象要加大括号

[[fallthrough属性]]:C++17引入的特性,如果可以允许fallthrough,可以加本属性,抑制编译器报警

与if相比的优劣:

(1)分支描述能力较弱

(2)在一些情况下能引入更好的优化,if-else串会造成全量搜索,switch可以哈希查找或二分查找从而提高速度

三.循环语句

3.1while

处理逻辑:

(1)从判断条件是否满足,如果不满足则跳出循环

(2)如果条件满足则执行循环体

(3)执行完循环体后转向步骤1

注意:在while的条件部分不包含额外的初始化内容,需要的话可以使用for

3.2do-while

 处理逻辑:

(1)执行循环体

(2)判断条件是否满足,如果不满足则跳出循环

(3)如果条件满足则转向步骤1

注意:结尾处要有分号,表示一条语句的结束

3.3for

最强大的循环

处理逻辑:

(1)初始化语句会被首先执行

(2)条件部分会被执行,执行结果如果为false则终止循环

(3)否则执行循环体

(4)迭代表达式会被求值,之后转向2

在初始化语句中可以声明多个名字

初始化语句、条件、迭代表达式可以为空

使用迭代器进行for循环

3.4基于范围的for循环

range-for

本质:for循环的语法糖,编译器会转换为for循环

取元素:

(1)使用常量左值引用读元素

(2)使用完成引用 auto&

3.5循环的中断

break:导致外围最近的循环终止跳出

continue:跳过循环体的剩余部分,相当于立即调到循环体结尾

注意:这二者均不适用于多重嵌套循环,可能会导致逻辑混乱。多重嵌套循环的跳转可考虑goto语句

 

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

循环展开:

(1)适用循环展开提升系统性能,增加循环内的工作量

(2)注意一次循环内的内存越界,为了防止内存越界,要特殊处理最终的余数

处理无法整除的情形:

(1)再额外增加一个循环语句

(2)将switch与循环结合——达夫设备

达夫设备:switch内部套循环,先走switch逻辑挑选指定case开始,然后进入循环逻辑

posted @ 2023-02-25 21:14  啊原来是这样呀  阅读(18)  评论(0)    收藏  举报