简介
复合语句通常称为“块”,是用一对花括号括起来的语句序列,可能为空;
块标识了一个作用域,在块内(某个大括号内)引入的名字只能在该块内部或嵌套在块中的子块里边访问,通常,一个名字只从其定义处到该块的结尾这段范围内可见;
一个在控制结构里引入的名字是该语句的局部变量,其作用域局限在语句内部。
在语句的条件表达式中定义的变量必须初始化,该条件检验的就是初始化对象的值;
break 语句中断当前控制流,对于switch ,break语句将控制跳出switch,继续执行switch语句后面的第一个语句
最好在每个标号后面提供一个break 语句,即使是最后一个标号也一样
实际上,程序不是只会执行匹配的case标号相关联的语句。程序从该点(匹配点)开始执行,并跨越case 边界继续执行其他语句,直到switch 结束或遇到break语句为止。
一个标号不能独立存在,它必须位于语句之前(即使是空语句);
如果switch结构以default标号结束,而且default不需要完成任何任务,那么该标号后面必须有一个空语句。
switch 表达式可以非常复杂,可以是一个变量,也可以定义和初始化一个变量,但是case 标号必须是整型常量表达式
对于switch结构,只能在它的最后一个case标号和default标号后面定义变量,制定这个规则的目的是为了避免出现代码跳出变量的定义和初始化的情况
对于switch结构,只能在它的最后一个case标号和default标号后面定义变量,制定这个规则的目的是为了避免出现代码跳出变量的定义和初始化的情况
如果在两个case标号之间定义变量,那么该变量会在块结束之前一直存在,对于定义该变量的标号后面的其他case标号,他们所关联的代码都可以使用这个变量。如果switch从那些后续case标号开始执行,那么这个变量可能还没有定义就要使用了。(因为变量的定义可能是在某个不匹配的case 标号下的语句)
break语句用于结束最近的while、do while 、for 或switch 语句,并将程序的执行权传递给紧接在被终止语句之后的语句。
break语句只能出现在循环或switch结构中,或者出现在嵌套于循环或switch结构中的语句里。
对于if 语句,只有当它嵌套在switch或循环里面时,才能使用break。
break出现在循环外或者switch外将会导致编译出错。
当break出现在嵌套的switch或者循环语句中时,将会终止里层的switch或循环语句,而外层的switch或者循环不受影响。
===========================================================================
一、声明语句
二、复合语句
1、块语句
复合语句通常称为“块”,是用一对花括号括起来的语句序列,可能为空;
块标识了一个作用域,在块内(某个大括号内)引入的名字只能在该块内部或嵌套在块中的子块里边访问,通常,一个名字只从其定义处到该块的结尾这段范围内可见;
2、语句的作用域
有些语句允许在他们的控制结构中定义变量
在条件表达式中定义的变量必须初始化,该条件检验的就是初始化对象的值;
在语句的控制结构中定义的变量,仅在定义他们的块语句结束前有效,变量的作用域仅限在语句体内;
一个在控制结构里引入的名字是该语句的局部变量,其作用域局限在语句内部。
for(vector<int>::size_type index=0;index!=vec.size();++index)
{
int square=0;
if(index%2)
square=index*index;
vec[index]=square;
}
if(index!=vec.sizeO())//错误,因为index只是for循环里面定义的一个变量
三、if 语句
1、if 语句
i f( condition )
{
statement;
}
其中condition 部分必须用圆括号括起来。
condition 条件部分可以是:
表达式 如:if (a+b>c);
初始化的声明 如:if (int ival = computer_value())
注意:
如果在条件表达式中定义了变量,那么变量必须初始化;
将已经初始化的变量值转换为bool 值后,该bool 值决定条件是否成立;
条件表达式中定义的变量可以是算术类型或指针类型;
IO类类型可以用作条件 if (cin >> ch);
vector 类型和string类型一般不可用作条件
四、switch 语句
1、switch 语句的使用
char ch;
int aCnt =0;eCnt=0;iCnt=0;oCnt=0;uCnt=0;
while(cin>>ch){
switch(ch){
case 'a':
++aCnt;
break;
case 'e':
++eCnt;
break;
case 'i':
++iCnt;
break;
case 'o':
++oCnt;
break;
case 'u':
++uCnt;
break;
}
}
如果表达式与其中一个case标号的值匹配,则程序将从该标号后面的第一个语句开始执行各个语句,直到switch 结束或遇到break 语句为止。
如果没有发现匹配的case标号,并且也没有发现default 标号,则程序从switch语句后面的第一个语句继续执行(是switch后面的语句)。
break 语句中断当前控制流,对于switch ,break语句将控制跳出switch,继续执行switch语句后面的第一个语句,这里也就是指交回给while
2、switch语句中的控制流
- 最好在每个标号后面提供一个break 语句,即使是最后一个标号也一样
重点:
实际上,程序不是只会执行匹配的case标号相关联的语句。程序从该点(匹配点)开始执行,并跨越case 边界继续执行其他语句,直到switch 结束或遇到break语句为止。
switch(ch){
case 'a':
++aCnt;
case 'e':
++eCnt;
case 'i':
++iCnt;
case 'o':
++oCnt;
case 'u':
++uCnt;
}
//这个统计元音字母的switch语句是错误的。
//假设,ch 的值是‘i’,那么程序从 case 'i': 后面的语句开始执行,iCont的值加1.但是程序的执行并没有在这里停止,而是越过case 标号继续执行,同时将oCnt、uCnt的值都加1.
3、慎用break 语句
比较少见的是,为了执行某个case的代码后继续执行下一个case,故意省略break语句。
//如果我们希望计算文本中总的元音字母的总数,而不是每个元音的个数
int voweCnt=0;
switch(ch){
case 'a':
case 'e':
case 'i':
case 'o':
case 'u':
++voweCnt;
break;
}
4、default 标号
- default 标号提供了相当于else 子句的功能。如果所有的case 标号都与switch 表达式的值不匹配,并且default标号存在,则执行default标号后面的语句。
一个标号不能独立存在,它必须位于语句之前(即使是空语句);
如果switch结构以default标号结束,而且default不需要完成任何任务,那么该标号后面必须有一个空语句。
5、switch 表达式与case标号
- switch 表达式可以非常复杂,可以是一个变量,也可以定义和初始化一个变量
- 但是case 标号必须是整型常量表达式
switch (int ival = get_response()) {
case : 3.14: //错误!!!!!
case ival; //错误!!必须是整型常量表达式
}
6、switch 内部的变量定义
对于switch结构,只能在它的最后一个case标号和default标号后面定义变量,制定这个规则的目的是为了避免出现代码跳出变量的定义和初始化的情况
如果在两个case标号之间定义变量,那么该变量会在块结束之前一直存在,对于定义该变量的标号后面的其他case标号,他们所关联的代码都可以使用这个变量。如果switch从那些后续case标号开始执行,那么这个变量可能还没有定义就要使用了。(因为变量的定义可能是在某个不匹配的case 标号下的语句)
switch(ch){
case true:
{string file_name = get_file_name();//file_name只在这个大括号里面有效
}
break;
case false:
}
五、while语句
1、while 语句的循环条件
循环条件可以是一个表达式,也可以是提供初始化的变量定义。
在循环条件中定义的变量在每次循环里都要经历创建和撤销的过程。
bool quit =false;
while(!quit){ //表达式
quit = do_something();}
while(int loc=search(name)){//变量的定义和初始化
}
2、while循环的使用
int arr1[10];
int * source = arr1;
size_t sz = sizeof(arr1)//sizeof(*arr1);p167 .对数组用sizeof操作
int * dest = new int[sz];
while(source !=arr1+sz)
*dest++=*source++;
*dest++=*source++;//等同于下面三个语句
*dest = * source;
++dest;
++source;
六、for 循环语句
1、
七、do-while 语句
1、do-while 语句
- 保证循环体至少执行一次。
- 与while语句不同的是,do-while 语句总是以分号结束;
3.
八、break语句
1、break语句
- break语句用于结束最近的while、do while 、for 或switch 语句,并将程序的执行权传递给紧接在被终止语句之后的语句。
- break语句只能出现在循环或switch结构中,或者出现在嵌套于循环或switch结构中的语句里。
- 对于if 语句,只有当它嵌套在switch或循环里面时,才能使用break。
- break出现在循环外或者switch外将会导致编译出错。
- 当break出现在嵌套的switch或者循环语句中时,将会终止里层的switch或循环语句,而外层的switch或者循环不受影响。
vector<int>::iterator iter=vec.begin();
while(iter!=vec.end()){
if(value==*iter)
break;//终止while循环,执行权交给while后面的if语句
else
++iter;
}
if(iter!=vec.end())
//本例中,break 终止了while循环,执行权交给紧跟在while语句后面的if语句,程序继续执行。
#include <iostream>
#include<bitset>
using namespace std;
int main()
{
string inBuf;
while(cin>>inBuf&&!inBuf.empty()){
switch(inBuf[0]){
case '_':
for(string::size_type ix=1;ix!=inBuf.size();++ix){
if(inBuf[ix]==' ')
break;// # 1
cout<<"break end up the for"<<endl;
}
cout<<"break do not end up the case"<<endl;
break; // # 2
case '+':
cout<<"jia"<<endl;
}
}
return 0;
}
//标记#1 的break终止了连字符(‘—’)case标号内的for循环,但没有终止外层的switch语句。而且事实上也没有结束当前case语句的执行。接着程序继续执行for语句后面的第一个语句,即处理连字符case标号下的其他代码,或者执行结束这个case的break语句。
//标记#2 的break终止了处理连字符情况的switch语句,但没有终止while循环。程序接着执行break后面的语句,即求解while的循环条件,从标准输入读入下一个string对象。

本文详细解析了程序设计中的各种控制流程语句,包括条件语句(if, switch)、循环语句(while, for, do-while)及中断语句(break)。重点介绍了这些语句的使用场景、语法细节及其在程序中的作用域特点。
359

被折叠的 条评论
为什么被折叠?



