语句类似于自然语言中的句子.C++语言既有只完成单一任务的简单语句,也有作为一个单元执行的由一组语句组成的复合语句.和大多数语言一样,C++也提供了实现条件分支结构的语句以及重复地执行同一段代码的循环结构.
通常情况下,语句是顺序执行的.但是,除了最简单的程序外,只有顺序执行往往并不足够.为此,C++定义了一组控制流(flow-of-control)语句,允许有条件地执行或者重复地执行某部分功能.if和switch语句提供了条件分支结构,而for、while和do while语句则支持重复执行的功能.后几种语句常称为循环或者迭代语句.
6.1 简单语句
C++中,大多数语句以分号结束.例如,想ival+5这样的表达式,在后面加上分号,就是一条表达式语句(expression statement).表达式语句用于计算表达式.但执行下面的语句
ival+5; //expression statement
却没有任何意义:因为计算出来的结果没有用于赋值或其他用途.通常,表达式语句所包含的表达式在计算时会影响程序的状态,使用赋值、自增、输入或输出操作符的表达式就是很好的例子.程序语句最简单的形式是空语句(null statement),它使用以下的形式(只有一个单独的分号):
; //null statement
如果在程序的某个地方,语法上需要一个语句,但逻辑上并不需要,此时应该使用空语句.这种用法常见于在循环条件判断部分就能完成全部循环工作的情况.例如,下面程序从输入流中读取数据,在获得某个特殊值前无需作任何操作:
//read until we hit end-of-file or find an input equal to sought
while (cin>>s && s!=sought)
; //null statement
循环条件从标准输入中读入一个值并检验cin的读入是否成功.如果成功读取数据,循环条件紧接着检查该值是否等于sought.如果找到了需要的值,则退出while循环;否则,循环条件再次从cin里读入另一个值继续检验.
-------------------------------------------------------------我是渴望努力的分割线------------------------------------------
实践告诉你:使用空语句时应该加上注释,以便任何读这段代码的人都知道该语句是有意省略的.
-------------------------------------------------------------我是渴望努力的分割线------------------------------------------
由于空语句也是一个语句,因此可用在任何允许使用语句的地方.由于这个原因,那些看死非法的分号往往只不过是一个空语句而已:
//ok:second semicolon is superfluous null statement
ival=v1+v2;
这个程序段由两条语句组成:一条表达式语句和一条空语句.
---------------------------------------------------------------我是七夕还在努力的分割线------------------------------------
小心:无关的空语句并非总是无害的.也就是说,不要故意为之,不得以才为之.
----------------------------------------------------------------我是七夕还在努力的分割线-----------------------------------
在while或if条件后面额外添加分号,往往会彻底改变程序员的意图:
//disaster:extra semicolon: loop body is this null statement
while(iter!-svec.end()); //null statement--while body is empty!
++iter; //increment is not part of the loop
这个程序将会无限次循环.与缩进的意义相反,此自增语句并不是循环的一部分.由于循环条件后面多了一个分号,因此循环体为空语句.
6.3 复合语句(块)
复合语句(compound statement),通常被称为块(block),是用一对花括号括起来的语句序列(也有可能是空的).块标识了一个作用域,在块中引入的名字只能在该块内部或嵌套在块中的子块里访问.通常,一个名字只从其定义处到该块的结尾这段范围内可见.
复合语句用在语法规则要求使用单个语句但程序逻辑却需要不止一个语句的地方.例如,while或for语句的循环体必须是单个语句.然而,大多数情况都需要在循环体里执行多个语句.因而可使用一对花括号将语句序列括起来,使其成为块语句.
以前的处理书店问题的程序中的一段while循环:
//if so,read the transaction records
while(std::cin>>trans)
if(total.same_isbn(trans))
//match:update the running total
total=total+trans;
else{
//no match:print & assign to total
std::cout<<total<<std::endl;
total=trans;
}
在else分支中,程序逻辑需要输出total的值,然后用trans重置total.但是,else分支只能后接单个语句.于是,用一对花括号将上述两条语句括起来,使其在语法上成为单个语句(复合语句).这个语句既符合语法规则又满足程序的需要.
------------------------------------------------------------我是华丽的分割线-----------------------------------------------
注解:与其他大多数语句不同,块并不是以分号结束的.
------------------------------------------------------------我是华丽的分割线-----------------------------------------------
像空语句一样,程序员也可以定义空块,用一对内部没有语句的花括号实现:
while(cin>>s && s!=sought)
{} // empty block
习题6.1 什么是空语句?请给出一个使用空语句的例子.
习题6.2 什么是块语句?请给出一个使用块的例子.
习题6.3 使用逗号操作符重写书店问题中while循环里的else分支,使它不再需要用块实现.解释一下重写后是提高还是降低了该段代码的可读性.
习题6.4 在解决书店问题的while循环中,如果删去while后面的左花括号及相应的右花括号,将会给程序带来什么影响?