《C++ primer》英文第五版阅读笔记(二十一)——简单语句,语句范围和条件语句

Chapter5——Statement 

语句

语句是按顺序执行的。除了最简单的程序以外,顺序地执行是不够的。因此,C++中也定义了允许更加复杂的执行路径的控制流语句集合。


一、简单语句


1.在C++中大多数的语句以分号结尾。比如表达式ival+5,当它后面加上一个分号的时候就变成了一个表达式语句。

2.在表达式语句中,表达式会被计算,但是值会被丢弃。
3.通常在表达式语句里面的表达式会在一边产生影响,比如当它被计算出值时,将这个值赋值给一个变量,或者将这个值输出。

空语句
1.最简单的语句是空语句。一个空语句由一个分号;构成。
2.当在程序语言中需要一个语句,但是程序的逻辑上并不需要语句时,可以使用“空语句”。常常在满足条件的循环体中这样使用。
3.空语句应该要添加注释,这样任何读这个程序的人就会知道这是故意省略了语句。


注意不要丢失分号或多写分号
1.因为空语句是一个分号,所以在任何可以出现语句的地方它都是合法的。正因为这个原因,当它出现在看似非法的地方时却可以被当做空语句处理。
2.尽管不必要的空语句通常并没有什么坏处,但是在while或if的条件后面跟随的分号却有可能完全改变编程者写这个程序的意图。
例如:while(i>=3) ;
++i ;
此时,++i并不是循环体的一部分。真正的循环体是while条件后面跟随的由分号组成的空语句!
注意:多余的空语句并不都是无害的!


复合语句(块)

1.复合语句,通常被称为“块”,是许多语句组成的序列,并且在一对花括号中进行声明。
2.一个块就是一个范围,在一个块里声明的名字只有在那个块里或者在内嵌在那个块里的块里面是有效的。
3.在一个块里,一个名字的有效范围是从它被定义开始,到相应的代码块的结束。
4.复合语句通常被用在当程序语言只需要一条语句,但是程序的逻辑需要不止一条语句的时候。
5.一个块并不是以分号;结束的。
6.当在一对花括号里面什么也不写时,我们就定义了一个空块。一个空块和一个空语句是等价的。


二、语句范围
1.我们可以在if,while,switch,for语句的控制结构中定义变量,但是这样定义的变量在控制语句内部是程序可见的,超出这个范围它就失效了。
2.如果想要使用控制变量,就将它定义在控制语句外面。
3.在控制结构中定义的变量是要被该控制结构使用的,因此这样的变量必须被初始化。


三、条件语句
C++提供了两种按条件进行执行的语句:
if语句根据“条件”决定控制流的流向。
switch语句通过计算一个整式的值,然后根据这个值选择一个执行路径。


if语句
if语句根据条件的真假进行相应语句的执行。它有两种形式,一种有else分支,一种没有。


形式一:

if(condition)
statement
条件为真,执行statement语句,执行完毕后接着执行if语句后面的语句。


形式二:

if(condition)
statement1
else 
statement2
条件为真,执行statement1语句,执行完毕后跳过statement2,接着执行if语句后面的语句。
条件为假,执行statement2语句,执行完毕后接着执行if语句后面的语句。


在这两种形式中,condition条件必须被放在括号里面,condition可以是一个表达式或者一个初始化的变量
声明。这个表达式或变量必须能够转换为布尔bool类型。像以往一样,statement1和statement2都可以是一个块。


if语句可以进行嵌套。



为了避免出错及以后代码的修改,建议在if和else后面都跟上一对花括号。对于while和for语句也是如此。


“Dangling else“问题:
1.当进行if-else嵌套时,有时会不知道一个else到底是与哪个if进行匹配的,这就是所说的"Dangling else"问题。在C++中解决方式是:每一个else都与在它们前面的,离它们最近的,未进行匹配的if进行匹配。
2.可以通过使用花括号控制执行路径。
3.如果想让else与外面的if进行匹配,可以把在if里面的if放在一个块里面。


switch语句

1.switch语句提供了一种方便的方式,可以在许多固定的选项中进行选择。
形式:
switch(ch) {
case ch1:
case ch2:
case ch3:
......
default:
}
其中ch是整型。ch会依次与ch1,ch2,ch3,......进行比较,当有匹配的时候,就执行那个case后的语句,直到switch的末尾或遇到break结束执行。如果都没有匹配的,就接着执行switch后面的语句。

2.关键字case和它后面的值被称为”选择标号“,case标号必须是整型常数表达式。并且两个选择标号不能有相同的值。


3.switch执行的顺序是,当有一个case匹配时,就会执行那个case以及它之后的所有case后面的语句,直到程序显示地进行中断为止。为了避免执行其余所有的case,通常在每一个case中的最后一个语句都是break。


4.有时候许多个case会执行相同的操作,那么就可以省略break,将这些case放在一块,只在其中的最后一个case中写执行语句,语句的最后是break。


5.因为C++的形式自由,因此case标号并不需要每个都单独在一行中,可以把许多个case写在同一行。


6.注意:在case后面省略break是很少发生的,如果省略了break,则添加一个说明逻辑的注释。


7.虽然在最后一个case的末尾加上break是没有必要的,但是最好都加上,以免在这个case之后又增加了新的case之后引起程序的执行错误。


8.default标号:当没有一个case匹配时,就会执行在default标号后面的语句。
定义一个default标号是十分有用的,尽管可能在default中什么也不做。定义一个空的default会让读者知道考虑到了这种情况。


9.一个标号不能单独存在,它必须在一个语句或者另一个标号之前。如果switch以一个default结束,并且default中什么也不做,那个default后面必须跟一个空语句或是一个空块。


10.在switch中执行的语句可能之前跳过了许多的语句,那么当它跳过了一个变量定义时会发生什么呢?
答案是:这是非法的。在同一个范围内,如果它跳过的语句中包含变量的初始化,那么就是非法的。如果该变量的初始化在块中,则是合法的。


10.如果有变量的定义,但是没有变量没有进行隐式或显式的初始化,那么是合法的。


11.如果前面的case中定义了变量,但未初始化,则后面的case可以使用前面case定义的这个变量,进行赋值等操作(因为此时在同一个范围内)。但是如果这个变量定义在了块中,则后面的case不能再使用它,因为此时不在同一个范围内。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值