空语句
用于语法上需要一个语句,而逻辑上并不需要的位置,此时需要一个空语句,
while (cin >> s && s != sought)
; //空语句
if语句
if(minVal<=ivec[i])
if(minVal==ivec[i])
++occurs;
else
{
minVal=ivec[i];
occurs=1;
}
上述程序中if子句多于else子句时,对于每个else,究竟归宿哪个if语句?
通过将else匹配给最后出现的尚未匹配的if子句来解决。此时,上述程序等价于
if(minVal<=ivec[i])
if(minVal==ivec[i])
++occurs;
else<pre name="code" class="cpp" style="font-size: 14px; line-height: 26px;"> {
minVal=ivec[i];
occurs=1;
}
switch语句
switch语句提供了一种更方便的的方法来实现深层次嵌套的if/else逻辑
char ch;
int aCnt = 0,eCnt = 0,iCnt = 0,
oCnt = 0,uCnt = 0;
while (cin >> ch)
{
switch (ch)
{
case 'a':
++aCnt; //不要忘记后面的break标号!
break;
case 'e':
++eCnt;
break;
case 'i':
++iCnt;
break;
case 'o':
++oCnt;
break;
case 'u':
++uCnt;
break;
}
}
cout << "a: " << aCnt << '\n'
<< "e: " << eCnt << '\n'
<< "i: " << iCnt << '\n'
<< "o: " << oCnt << '\n'
<< "u: " << uCnt << endl;
如果表达式与其中一个
case
标号的值匹配,则程序将从该标号后面的第一个语句开始依次执行各个语句,知道
switch结束或者遇到break语句为止!
尽管没有严格要求在switch结构的最后一个 标号之后指定break语句,但是,为了安全起见,最好在每个标号后面提供一个break语句,即使是最后一个标号也一样。
default标号
如果所有的case标号与switch表达式的值都不匹配,并且default标号存在,则执行default标号后面的语句。
switch(ch)
{
case 'a':
++aCnt;
break;
default:
++otherCnt;
break;
}
哪怕没有语句要在
default
标号下执行,定义
default
标号仍然是有用的。定义
default
标号是为了告诉读者,表明这种情况已经考虑到了,只是没什么要执行的!
for语句
for(初始化语句;条件循环;表达式)
......
初始化语句,条件循环,表达式中的任何一个或者全部都可以省略。
dowhile语句
与while语句不同,dowhile保证循环体至少执行一次,而且dowhile语句是以;分号结束
如果把变量定义在了do内部,那么该变量的作用域就被限制在while前的花括号之前了
do
{
int ival = 1;
}
while (ival == 1);//error
break语句
break语句用于结束最近的while、dowhile、for或switch语句,并将程序的执行权传递给紧接在被终止语句之后的语句。
break出现在循环外或者switch外会导致编译时错误。
goto语句
从上世纪60年代开始,就不主张使用goto语句了。goto语句使得跟踪程序控制流程变得异常困难,并且使得程序难以理解。所有使用goto的程序都可以改写成为不用goto的语句,因此也就没有必要使用goto语句了!
goto label;
//...
label:
//...
try块和异常处理
在设计良好的系统中,异常是程序错误处理的一部分。当程序代码检查到无法处理的问题时,异常处理就特别有用。在这些情况下,检测出问题的那部分程序需要一种方法把控制权转到可以处理这个问题的那部分程序。错误检测程序还必须指出具体出现了什么问题,并且可能需要提供一些附加信息。
异常机制提供程序中错误检测与错误处理部分之间的通信。C++的异常处理中包括:
1.throw表达式,错误检测部分使用这种表达式来说明遇到了不可处理的错误。可以说,throw引发了异常条件。
2.try块,错误处理部分使用它来处理异常。try语句块以try关键字开始,并以一个或多个catch子句结束。在try块中执行的代码所抛出(throw)的异常,通常会被其中一个catch子句处理。由于它们“处理”异常,catch子句也称为处理代码。
3.由标准库定义的一组异常类,用来在throw和相应的catch之间传递有关的错误信息。
throw表达式
系统通过throw表达式抛出异常,throw表达式的类型决定了所抛出异常的类型。
Sales_item item1,item2;
cin >> item1 >> item2;
if (!item1.same_isbn(item2))
{
//需要包含stdexcept头文件
throw runtime_error("Data must refer to same ISBN");
}
else
{
cout << item1 + item2 << endl;
}
try块
一旦catch子句执行结束,程序流程立即继续执行紧随最后一个catch子句后的语句。
在try块中声明的变量,包括catch子句中声明的变量,不能在try外面使用。
Sales_item item1,item2;
while (cin >> item1 >> item2)
{
try
{
if (!item1.same_isbn(item2))
{
throw runtime_error("Data must refer to same ISBN");
}
}
catch (runtime_error err)
{
cout << err.what()
<< "\nTry Again? Enter y or n" << endl;
char c;
cin >> c;
if (cin && c == 'n')
{
break;
}
}
cout << item1 + item2 << endl;
}
在执行
try
块代码的过程中,如果在
try
块中的代码抛出
runtime_error
类型的异常,则处理这类异常的动作在
catch
后面的块语句中定义。