本 Wiki 开启了 HTTPS。但由于同 IP 的 Blog 也开启了 HTTPS,因此本站必须要支持 SNI 的浏览器才能浏览。为了兼容一部分浏览器,本站保留了 HTTP 作为兼容。如果您的浏览器支持 SNI,请尽量通过 HTTPS 访问本站,谢谢!
这里会显示出您选择的修订版和当前版本之间的差别。
两侧同时换到之前的修订记录前一修订版后一修订版 | 前一修订版 | ||
zh:cpp:cpp_note:cpp_primer:5_statements [2017/02/20 09:42] – [5.2. 标准异常类] haregy | zh:cpp:cpp_note:cpp_primer:5_statements [2017/02/27 12:03] (当前版本) – 移除 haregy | ||
---|---|---|---|
行 1: | 行 1: | ||
- | ====语句==== | ||
- | C++ Primer 笔记 第五章\\ | ||
- | <wrap em> | ||
- | ===== ===== | ||
- | ====1.简单语句==== | ||
- | ===1.1.空语句=== | ||
- | 空语句用在逻辑上不需要,但是语法需要的地方。比如for循环的条件中就可以完成计算,但是仍然需要一个空语句作为结束。我们可以用一个";" | ||
- | ===1.2.块/ | ||
- | 如果我们需要在循环里用一大段代码来进行运算,我们就需要用curly braces" | ||
- | 块内定义的变量必须初始化,因为这些变量会被定义他们的控制结构所用到。 | ||
- | ====2.条件语句==== | ||
- | 主要的条件语句有if-else / switch-case。具体应用哪种语句根据条件的数量来看。总的来说,条件越多,用switch-case的效率越高。 | ||
- | ===2.1.If-else=== | ||
- | If-else的主要注意点是:if-else关键字总是寻找最近对应的if/ | ||
- | ===2.2.switch-case=== | ||
- | switch-case是通过case_label来进行条件判断的,所以在一个语句里,case的值不能有重复的。如果不是希望多组case共同表达一个分支,我们应该在每个case执行完毕后接上一个break, | ||
- | \\ | ||
- | switch-case中,在case作用域中定义并初始化变量是错误的,因为控制流很可能绕过这个定义语句,导致这个变量定义无效。所以如果需要在case作用域里定义变量,我们需要加上" | ||
- | ====3.迭代语句==== | ||
- | ===3.1.while / do while=== | ||
- | while / do while循环的条件可以由表达式或者已经初始化的变量声明来充当,比如: | ||
- | < | ||
- | int = 1; | ||
- | if (i) {//using a declared variable as the condition。 | ||
- | statment; | ||
- | } | ||
- | </ | ||
- | while语句在条件一开始false的时候是不会执行的,do while 语句则会执行一遍。因此而对于do while来说,会先执行块再判断条件,所以**在do while的条件里定义变量是非法的**。 | ||
- | ===3.2. for / range for === | ||
- | 对于不确定循环的情况来说,用while是很好的。但如果我们希望指定循环多少次,那么我们可以用for。\\ | ||
- | 传统的for由三部分组成,中间用分号分开: | ||
- | < | ||
- | for (init-statement ; condition ; expression) | ||
- | statment; | ||
- | </ | ||
- | 跟while 一样,如果条件起始为false,那么语句就不会执行,而for中定义的初始值只在for循环里有效。对于这个init-statement, | ||
- | \\ | ||
- | 在C++11中,我们有了for的另外一种表达形式: | ||
- | |||
- | < | ||
- | for (declaration : expression) | ||
- | | ||
- | </ | ||
- | 这里的expression必须是一个序列(List初始化的序列/ | ||
- | ====4.跳转语句==== | ||
- | ===4.1.break / continue=== | ||
- | break 会跳出最近的循环,而continue只会跳出最近循环的当次迭代。 | ||
- | ===4.2.goto=== | ||
- | goto语句的语法是: | ||
- | < | ||
- | goto label; | ||
- | </ | ||
- | 这个label是由label名和冒号组成。如果goto语句绕过了一个变量的定义,而直接跳转到了直接使用这个变量的语句,那么这个goto是非法的。\\ | ||
- | goto会显著破外程序的结构性,所以最好不要用。 | ||
- | ====5.异常处理==== | ||
- | C++中的异常处理由3部分组成: | ||
- | - throw表达式,用于抛出异常 | ||
- | - try / catch: 我们把代码放到try block中,这样try就可以侦测到抛出的异常,然后把异常的类型与catch中的异常判断做对比。如果有匹配,则通过对应的catch子语句对异常进行处理。 | ||
- | - exception class. 用于抛出异常 (throw) 和处理异常(try-catch)之间传递异常的具体信息。\\ | ||
- | 整个异常处理的过程是这样的:\\ | ||
- | **我们用throw抛出异常 -> 用try捕获异常 -> 用catch处理异常 -> catch无法处理则转到Library function terminate。** | ||
- | ===5.1.异常处理的顺序=== | ||
- | 我们在复杂程序里经常可以遇到一种情况:程序在抛出异常之前,已经执行了很多个try,比如嵌套的try-catch语句。那么检测到异常后,应该如何处理? | ||
- | 异常处理的顺序刚好和函数调用相反: | ||
- | - 异常被抛出的时候,首先搜索抛出异常的函数。 | ||
- | - 如果没有找到相对应的catch语句,则函数终止,并在调用该函数的函数中寻找。 | ||
- | - 如果还是没有找到,终止这个函数,接着搜索调用他的函数。 | ||
- | - 以此类推,按程序执行的顺序逐层回退,直到找到相应的catch。 | ||
- | - 如果最终没有找到,转到terminate function。 | ||
- | ===5.2. 标准异常类=== | ||
- | C++中定义了一组标准类来传递异常的信息。这些异常类被分别定义在4个header中: | ||
- | ^ | ||
- | ^ exception | ||
- | ^ stdexcept| 定义了几种通用类| | ||
- | ^ new | 定义了bad_alloc的异常类型 | ||
- | ^ type_info | ||
- | 而stdexcept里定义了一些详细的异常类,大概分为runtime_error和logic_error两部分,详情见下图: | ||