详解C++编程中的条件判断语句if-else与switch的用法
if-else语句
控制条件分支。
语法
if(expression) statement1 [else statement2]
备注
如果expression的值不为零,执行statement1。如果选项else存在,如果expression的值为零,执行statement2。表达式必须是算术或指针类型,或者必须是定义明确的整型或指针类型转换的类类型。有关转换器的信息,请参见标准转换。
在两个形式的if语句和expression语句中计算,可以具有除结构以外的任何值,包括所有副作用。除非statement中的一个包含break、continue或goto,控件才能从if语句传递到项目中的下一条语句。
if...else语句的else子句与在没有相应的else语句的同一范围的最接近的前面if语句相关。
为了使此示例可以明确有关if...else配对,取消对大括号的注释。
//if_else_statement.cpp
#include<stdio.h>
intmain()
{
intx=0;
if(x==0)
{
printf_s("xis0!\n");
}
else
{
printf_s("xisnot0!\n");//thisstatementwillnotbeexecuted
}
x=1;
if(x==0)
{
printf_s("xis0!\n");//thisstatementwillnotbeexecuted
}
else
{
printf_s("xisnot0!\n");
}
return0;
}
输出:
x是0! x不是0!
switch语句
允许根据整型表达式的值在多个代码段中进行选择。
语法
switch(expression) caseconstant-expression:statement [default:statement]
备注
expression必须属于整型或存在到整型的明确转换的类类型。将按照整型提升中所述的方式执行整型提升。
switch语句体由一系列case标签和一个可选default标签组成。case语句中的两个常量表达式的计算结果不能为同一个值。default标签只能出现一次。标记语句不是语法要求,但如果它们不存在,switch语句是无意义的。默认语句无需显示在末尾;它可以显示在switch语句体的任何位置。case或default标签只能显示在switch语句内。
每个case标签中的constant-expression将转换为expression类型,并将与expression比较是否等效。控制到其caseconstant-expression与expression的值匹配的语句的传递。下表中显示了生成的行为。
switch语句行为
| 条件 | 操作 |
|---|---|
| 转换后的值与提升的控制表达式的值匹配。转换后的值与提升的控制表达式的值匹配。 | 控制将转移到跟在该标签后面的语句。 |
| 没有常量与case标签中的常量匹配;default标签存在。 | 控制将转移到default标签。 |
| 没有常量与case标签中的常量匹配;default标签不存在。 | 控制将转移到switch语句之后的语句。 |
如果找到匹配的表达式,则后续case或default标签不会妨碍控制。break语句用于停止执行并将控制转移到switch语句之后的语句。如果没有break语句,则将执行从匹配的case标签到switch末尾的每个语句,包括default。例如:
//switch_statement1.cpp
#include<stdio.h>
intmain(){
char*buffer="Anycharacterstream";
intcapa,lettera,nota;
charc;
capa=lettera=nota=0;
while(c=*buffer++)//WalksbufferuntilNULL
{
switch(c)
{
case'A':
capa++;
break;
case'a':
lettera++;
break;
default:
nota++;
}
}
printf_s("\nUppercasea:%d\nLowercasea:%d\nTotal:%d\n",
capa,lettera,(capa+lettera+nota));
}
在上面的示例中,如果c是大写A,则capa将递增。capa++之后的break语句会终止switch语句体的执行并将控制转移到while循环。如果没有break语句,lettera和nota也将递增。case'a'的break语句也能达到类似的目的。如果c是小写a,则lettera将递增,并且break语句将终止switch语句体。如果c不是a或A,则将执行default语句。
switch语句的内部块可以包含带有初始化的定义,前提是可以访问到它们-即,所有可能的执行路径都不会绕过它们。使用这些声明引入的名称具有局部范围。例如:
//switch_statement2.cpp
//C2360expected
#include<iostream>
usingnamespacestd;
intmain(intargc,char*argv[])
{
switch(tolower(*argv[1]))
{
//Error.Unreachabledeclaration.
charszChEntered[]="Characterenteredwas:";
case'a':
{
//DeclarationofszChEnteredOK.Localscope.
charszChEntered[]="Characterenteredwas:";
cout<<szChEntered<<"a\n";
}
break;
case'b':
//ValueofszChEnteredundefined.
cout<<szChEntered<<"b\n";
break;
default:
//ValueofszChEnteredundefined.
cout<<szChEntered<<"neitheranorb\n";
break;
}
}
switch语句可以嵌套。在这种情况下,case或default标签将与封装它们的最近的switch语句关联。