8.c/c++程序员面试宝典-switch语句
对于多选择分支的情况,可以用if语句的if...else...if形式或if语句嵌套处理,但大多数情况下却略显麻烦。为此,c++提供了另一种方法,switch语句,也成为开关语句。
面试题65 switch语句的执行顺序是什么***
分析:在使用深层嵌套的if else语句时,往往语法是正确的,但在逻辑方面却没有正确地反映程序员的意图。例如,错误的else if匹配很容易被忽略。即使添加新的条件和逻辑关系,或者对语句做其他修改,都很难保证正确。switch语句提供了一种更方便的方法来实现深层嵌套的if else逻辑。
switch语句的示例代码如下:
char ch;
int a1=0,e1=0,i1=0,//初始化变量数据
c1=0,u1=0;
while(cin>>ch)
{
switch(ch) //开始分支语句
{case 'a':
++a1;
break;
case 'e':
++e1;
break;
case 'i':
++i1;
break;
case 'o':
++o1;
break;
case 'u':
++u1;
break;}
}
通过对switch后的圆括号内表达式的值,与其后的花括号中用case列出来的关键字做比较,实现switch语句的分支功能。圆括号内的表达式必须产生一个整数结果,其值与每个case的值进行比较。关键字case和它所关联的值称为case标号。每个case标号的值都必须是一个常量表达式,当case标号的值和switch后圆括号的产生的结果对应时,则执行相应的case后的操作。
另外,在switch语句中,还有一个default语句,表示如果圆括号内表达式的值与case的关键字都没有匹配的情况下,可以设定一个默认执行的语句。示例代码如下:
#include"stdio.h"
main()
{
int year,month,days,flat;
printf("请输入年月份\n");
scanf("%d%d",&year,%month);
switch(month)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12: days=31;break;
case 4:
case 6:
case 9:
case 11: days=30;break;
case 2:
if((!(year %4) && (year%100)) || !(year %400))
days=29
else
days=28;break;
default: flag=0;
}
if(flay)
{printf("天数=%d\n",days);}
else
{printf("不存在的月份\n");}
}
以上代码实现的是输入一个年月,然后输出该月有多少天,如果是闰年的话,则2月份有29天。
【答案】如果表达式与其中一个case标号的值匹配,则程序将从该标号后面的第一个语句开始一次执行各个语句,直到switch结束或遇到break语句为止。如果没有发现匹配的case标号,则在存在dafault语句时执行default语句,否则程序从switch语句后面的第一条语句继续执行。
面试题66 如何在switch语句内部定义变量**
分析:在c++中,对于switch结构,能而且只能在它的最后一个case标号或default标号后面定义变量。示例代码如下:
case true:
string file_name = get_file_name();
break;
default:
... ...
这个规则的制定是为了避免出现代码跳过变量的定义和初始化的情况。另外也可以引入块语句,并且在该块语句中来定义变量,从而保证变量在使用前可以被定义和初始化。示例代码如下:
case true:
{
string file_name=get_file_name();
...
}
break;
case false:
{... ...}
【答案】在switch结构中可以在最后一个case标号或default标号后面定义变量,或者引入块语句来定义变量。