【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开始,然后进入循环逻辑

浙公网安备 33010602011771号