专栏首页未竟东方白【笔记】《C++Primer》—— 第5章:语句

【笔记】《C++Primer》—— 第5章:语句

稍有点晚的周更

第五章的标题是语句,主要讲的是我们平时写语句的一些基本要求和例如迭代语句控制语句等概念。这篇内容比较少而且因为平时用得很多所以写的自然也会少些。

5.1-5.2 语句基础

  1. 最简单的语句是空语句,也就是只有分号的语句。其可以放在语法需要语句但是逻辑不需要的地方。
  2. 在使用空语句时最好有注释,因为很容易打乱迭代或控制语句的安排。
  3. 相对应的,用花括号括起来的多条语句称为复合语句或语句块,在花括号中的变量有同个作用域,空块相当于空语句。
  4. 除了在for和while的控制结构(小括号内)可以定义变量,我们同样也可以在if和switch中定义,不过没什么很大需要。
  5. 定义在控制结构中的变量只能在那个控制语句中有效。

5.3 条件语句

  1. if语句要求控制结构中表达式的类型必须可以转为bool
  2. if语句可以层层嵌套,else if其实是嵌套if的一种不同的缩进而已,并不是特别的写法。
  3. 有的编码风格建议在if和else后面都使用花括号使得代码清晰
  4. 在C++来说,else语句默认是与当前仍未匹配的最接近的if进行匹配,称为悬垂else问题
  5. switch语句要求控制结构中表达式类型必须可转为整形
  6. switch的每个case都需要是常量整形且不能重复
  7. case不一定要break,可以故意省略break来达成多个case一口气执行,不过当使用这种写法时建议一边加上注释,一边将多个case写到同一行以强调其统一性。
  8. default标签会在没有任何case匹配时触发,即使不需要这种情况也建议写上一个空的default并加上注释。
  9. switch语句由于会进行语句跳转,要求不能跳过变量的初始化而使用变量,且每个case都有内部的一个作用域。
5.4 迭代语句
  1. 只要控制结构中为真while便会不断执行循环体,如果在while的控制结构或循环体中定义变量的话,这个变量将会在每次迭代中创建又销毁
  2. 一般来说while用在不能确定迭代的次数或者希望在循环结束时访问循环的控制变量的情况
  3. 传统的for结构的语句头中:初始化部分用于初始化控制变量,控制部分用于判断是否为真,只有真的时候才会执行循环体,然后修改部分用于改变控制变量,修改发生在每一轮迭代之后。
  4. for的语句头中任何部分都可以被省略,但是要注意会不会一不小心无限循环
  5. C11引入了新的for语句也就是目前很多其他语言都很流行的range-for语句,即范围for语句,之前我们也有提到。结构是for (declaration: expression) statement
  6. 范围for语句最重要的要求就是expression部分必须是序列,也就是可以得到begin-end成员的序列,且序列中每个元素都要和declaration符合,为保证符合最好的方法是使用auto
  7. 范围for语句会在每次迭代中将声明转为序列的下一个值,然后在执行循环体。由于范围for语句其实是传统for的变体,在开始循环时就储存了序列的begin和end,所以不要在循环中修改序列的长度导致begin-end改变
  8. do-while语句使得无论条件部分如何都会至少执行一次do中的代码,但是要注意的就是由于这个特点我们不能在do的控制体中定义变量,控制变量需要提前在外部定义

5.5 跳转语句

  1. C有4种跳转语句break,continue,goto,return。return下篇再写。
  2. break语句只能终止最接近的一层循环或者switch,也只能出现在这些语句之中,终止这一层后在外层接下来的第一句语句继续执行。
  3. continue语句则是终止最接近的一层循环然后立即开始下一次循环(包括条件判断),除非switch嵌套在循环中否则不能在swicth中用。
  4. goto语句是十分不推荐使用的语句,它太底层太暴力了,很容易让程序变得很乱,所有的goto都能转为循环
  5. goto语句与swicth类似,不能将程序的运行凌驾在变量的作用域上,也就是不能跳转到变量的定义之后来使用它,而如果跳转回变量的定义之前则相当于将变量销毁并重新创建。

5.6 异常语句

  1. C++的异常编写其实和我们更加熟悉的Java很像,同样的写法,同样需要在try中throw出异常对象然后用catch捕获并处理,所以要写的东西反而没那么多。
  2. C++的异常类在标准库中有定义,分别在stdexcept,exception,new,type_inifo四个头文件中,每个异常我们使用它们都有的what函数来得到异常的信息。
  3. stdexcept是平时最常用的头文件,文末有这个头文件中的异常类列表,在初始化这个异常对象时需要带入参数string,自己决定此异常抛出的信息。
  4. exception头文件中定义了最通用的异常类exception。这个类只抛出异常不描述信息。
  5. new头文件中定义了后面会说到的bad_alloc类型。
  6. type_info定义了更后面会说到的bad_cast类型。
  7. 后面的这三个头文件只能进行默认构造初始化,其what内容由编译器决定。
  8. 要注意抛出异常会中断当前的程序转为异常处理,这其中被中断的各种变量和状态的处理很难把控,编写异常安全的代码是很困难的。
  9. 当catch不到所抛出的异常时这个异常会继续往上一层抛,这个过程与函数的层层调用刚好相反,当抛到无法再抛(第一层)时,程序会转到terminate函数中,绝大多数情况下这会导致程序非正常终止。

<stdexcept>定义的异常类

本文分享自微信公众号 - 未竟东方白(WJDFB_),作者:飞光飞光

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-05-04

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【笔记】《C++Primer》—— 第四部分:高级主题(完)

    这篇是第四部分的总结,大致上就是回看了最后的3篇笔记并且重新翻翻书梳理了一下,内容基本都是从前面的章节复制来的。

    ZifengHuang
  • 【CPP】各种各样的树(9)——自顶向下的红黑树

    本以为春节后马上就能写完这些树了,结果没想到一拖再拖居然拖到了开学前,很真实。红黑树还是蛮难的,写着写着才意识到应该先搞完B树然后再写2-3-4树然后再来讲红黑...

    ZifengHuang
  • 【笔记】《C++Primer》—— 第一部分:C++基础

    说好的总结就是这个了,基本上就是再回看了下之前的7篇笔记并且重新翻翻书梳理了一下,也在此每小节补上了一开始没写的小标题。这篇写起来还是比较轻松的,基本都是从前面...

    ZifengHuang
  • 硬件描述语言VHDL——顺序语句

    版权声明:本文为博主原创文章,转载请注明博客地址: https://blog.csdn.ne...

    zy010101
  • C语言入门笔记3

    函数调用语句由函数名、实际参数加上分号“;”组成。执行函数语句就是调用函数体并把实际参数赋予函数定义中的形式参数,然后执行被调函数体中的语句,求取函数值。通过调...

    用户6755376
  • Python学习笔记3:语句结构

    上一篇Python学习笔记 Python学习笔记 2: Python的变量类型 主要介绍了Python的变量类型,以变量为基本单元,如何操作这些变量,进而解决特...

    光学小豆芽
  • python学习笔记:基本语法

    1.代码规范,这本身就是一个非常好的习惯,如果开始不养好好的代码规划,以后会很痛苦

    python学习教程
  • C语言常用的知识没多少之C语言的三大结构

    有人发现生活中的所有事情都离不开顺序、选择和循环。如烧水有它相应的流程(顺序);在十字路口有多个可选的路;每天太阳从东边升起、西边落下。至今还没有能够找到超出这...

    用户5935416
  • 函数式编程中的数组问题

    好久没讲技术了,先回忆一下啥是函数式编程(FP)吧,比如FP要求使用表达式,不允许出现语句,这样更接近自然语言。

    Jean
  • JavaScript大略

     简介: javascript是一种基于对象和事件驱动并具有安全性能的脚本语言。 它是通过嵌入或调入在标准的HTML语言中实现的。 数据类型:   St...

    用户1075292

扫码关注云+社区

领取腾讯云代金券