详解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语句关联。