C语言提供了一种用于多分支选择的switch语句, 其一般形式为:

switch(表达式)
{
case 常量表达式1:语句1; break;
case 常量表达式2:语句2; break;
  ....
  case 常量表达式n:语句n; break;
  default:语句;break;
}

它的意思是:计算表达式的值。并逐个与其后的常量表达式值相比较,当表达式的值与某个常量表达式的值相等时,即执行其后的语句,然后不再进行判断,继续执行后面所有case后的语句。如表达式的值与所有case后的常量表达式均不相同时,则执行default后的语句。处理流程图如下:

使用switch语句的规则是:

1、switch语句的判断条件可以接受int,byte,char,short,枚举,不能接受其他类型。

2、在case后的各常量表达式的值不能相同,否则会出现错误。

3、在case后,允许有多个语句,可以不用{}括起来。

4、各case和default子句的先后顺序可以变动,而不会影响程序执行结果。

5、default就是如果没有符合的case就执行它,default并不是必须的。

6、在都没有break 语句的情况下:首先会在所有的case 语句中,寻找满足条件的语句。如果找到,会从该语句顺序向下执行每个语句;若找不到,会从第一段开始,向下顺序执行每一段语句。

7、在有break 语句的情况下:找到一个满足条件的case 语句执行,若找不到,会执行default 的语句。

比如下面的例子:

#include <stdio.h>
int main(void)
{
inta;
printf("请输入一个整型数字:\n");
scanf("%d",&a);
switch(a)
{
case1:
printf("Monday\n");
case2:
printf("Tuesday\n");
case3:
printf("Wednesday\n");
case4:
printf("Thursday\n");
case5:
printf("Friday\n");
case6:
printf("Saturday\n");
case7:
printf("Sunday\n");
default:
printf("输入错误\n");
}
system("pause");
return0;
}

运行结果:

本程序是要求输入一个数字,输出一个英文单词。但是当输入3之后,却执行了case3以及以后的所有语句,输出了Wednesday 及以后的所有单词。这当然是不希望的。为什么会出现这种情况呢?这恰恰反应了switch语句的一个特点。在switch语句中,“case 常量表达式”只相当于一个语句标号,表达式的值和某标号相等则转向该标号执行,但不能在执行完该标号的语句后自动跳出整个switch 语句,所以出现了继续执行所有后面case语句的情况。这是与前面介绍的if语句完全不同的,应特别注意。

为了避免上面的情况,我们需要用到break语句,专用于跳出switch语句,break 语句只有关键字break,没有参数。在后面还将详细介绍。修改例题的程序,在每一case语句之后增加break 语句,使每一次执行之后均可跳出switch语句,从而避免输出不应有的结果。

修改后的代码:

#include <stdio.h>
int main(void)
{
inta;
printf("请输入一个整型数字:\n");
scanf("%d",&a);
switch(a)
{
case1:
printf("Monday\n");
break;
case2:
printf("Tuesday\n");
break;
case3:
printf("Wednesday\n");
break;
case4:
printf("Thursday\n");
break;
case5:
printf("Friday\n");
break;
case6:
printf("Saturday\n");
break;
case7:
printf("Sunday\n");
break;
default:
printf("输入错误\n");
}
system("pause");
return0;
}

执行结果:

可以看到运行结果正常了。

switch语句不是必不可缺的,显然可以用一组if..elseif...else if...else代替,但是一方面用switch语句会使代码更清晰,另一方面,有时候编译器会对switch语句进行整体优化,使它比等价的if/else语句所生成的目标代码效率更高。

使用switch语句要注意几点:

1、case后面跟的必须是常量表达式,因为这个值必须在编译时计算出来。

2、在C语言中,浮点型是不能精确比较相等不相等的。因此C语言规定case后面跟的常量表达式的值必须是可以精确比较的整型或字符型。

3、进入case后如果没有遇到break语句就会一直往下执行,后面其它case或default下面的语句也会被执行到,直到遇到break,或者执行到整个switch语句块的末尾。通常每个case后面都要加上break语句,但有时候故意不加break来利用这个特性

下面是使用switch语句的三种情况。

1、标准型(case后面都有break语句)

#include <stdio.h>

int main(void)
{
inti= 3;
switch(i)
{
case1:
printf("%d\n",1);
break;
case2:
printf("%d\n",2);
break;
case3:
printf("%d\n",3);
break;
default:
printf("%s\n","default");
break;
} system("pause");
return0;
}

运行结果:

2、特殊型1(不是完全有break语句,可以完成一些特殊应用)

#include <stdio.h>

int main(void)
{
intyear= 2014;
intmonth= 6;
intday;
switch(month)
{
case1:
case3:
case5:
case7:
case8:
case10:
case12:
day= 31;
break;
case2:
day= 28;
break;
case4:
case6:
case9:
case11:
day= 30;
break;
}
printf("%d\n",day); system("pause");
return0;
}

运行结果:

3、特殊型2(default的位置)

#include <stdio.h>

int main(void)
{
inti= 1;
switch(i)
{
case1:
printf("%d\n",1);
default:
printf("%s\n","default");
case2:
printf("%d\n",2);
break;
case3:
printf("%d\n",3);
break;
} system("pause");
return0;
}

运行结果:

C语言入门(11)——switch分支语句的更多相关文章

  1. Java基础知识强化19:Java中switch分支语句

    java中switch语句: 这里expression控制表达式的数据类型只能是byte.short.char.int四种整型类型和枚举类型,不能是boolean类型: Java7(1.7)改进了sw ...

  2. 浅谈Java中switch分支语句

    前言: 在程序中遇到多分支选择的时候,想必大家都喜欢用if...else if...else...语句,尤其是初学者,因为在了解switch语句之前,我也是只会用if...else语句.那么现在看完这 ...

  3. C++学习(十)(C语言部分)之 分支语句

    #include<stdio.h> // std 标准  io ---->  input  output  输入 输出  printf scanf getchar ...... #i ...

  4. switch分支语句

    语句句式 Calendar c = Calendar.getInstance(); //获得一周的某天 int i = c.get(Calendar.DAY_OF_WEEK); switch (i) ...

  5. c语言学习笔记 switch case语句为什么要加break

    先来看一个没有break的例子: int main() { int a = 1; switch (a) { case 1: printf("1"); case 2: printf( ...

  6. JS switch 分支语句

    描述:根据一个变量的不同取值,来执行不同的代码. 语法结构: switch(变量) { case 值1: 代码1; break; case 值2: 代码2; break; case 值3: 代码3; ...

  7. PHP switch分支语句中省略break后还会执行其他case的原因分析

    请分析以下PHP代码的输出结果: $a= 'dog'; switch($a) { case 'cat': echo "\$a is cat"; case 'dog': echo & ...

  8. C语言入门(10)——if分支语句

    在我们写的函数中可以有多条语句,但这些语句总是从前到后顺序执行的.除了从前到后顺序执行之外,有时候我们需要检查一个条件,然后根据检查的结果执行不同的后续代码,在C语言中可以用分支语句实现,比如: if ...

  9. 200-Java语言基础-Java编程入门-004 | Java分支与循环

    一.流程控制语句 可以控制程序的执行流程 在程序开发的过程之中一共会存在有三种程序逻辑:顺序结构.条件分支(选择)结构.循环结构. 顺序结构的定义,即:所有的程序将按照定义的代码从上往下.顺序依次执行 ...

随机推荐

  1. 如何实现 Excel方式二维变色提示的 m*n 表格

    此代码当m≠n 时,有问题.暂时还未解决此问题. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ...

  2. not valid for Running the scheme

    The run destination iPhone6 Plus is not valid for Running the scheme 'MyApp’. Phone6 Plus's iOS 8.0 ...

  3. wampserver配置memcache

    我用的环境是win7 64位的操作系统,wampserver也是64位,版本是2.5的,其中带的php版本是5.5的. 配置memcache的步骤: 第一步,先下载memcahed.exe和php_m ...

  4. mysqli扩展库的 预处理技术 mysqli stmt

    问题的提出? 现在需要向mysql数据库添加100个用户,请问如何实现? 思路: 使用for循环100次,向数据库中添加100个用户. 使用批量添加 $sql1=”insert xxx”; $ssql ...

  5. android apk 导出(签名) is not translated in xx 代码混淆 反编译

    apk导出遇到问题 解决方式如下 1.导出步骤第一步 2.提示错误 3.解决 其余步骤参见: 代码混淆和数字签名(现在版本混淆) http://blog.csdn.net/moruna/article ...

  6. poj1504--求两个数的反转数的和的反转数

    题意:给定4321 5678,结果再反转(1234+8756) 一开始以为是poj1503一样,就稀里糊涂的敲代码,实际上有不同 如题:先求1234 + 8765 ------------------ ...

  7. C#下使用GDAL

    參考博客:http://blog.csdn.net/rrrrssss00/article/category/915498.以及viewmode=contents">李民录老师专栏.ht ...

  8. How to set custom JsonSerializerSettings for Json.NET in MVC 4 Web API?

    ou can customize the JsonSerializerSettings by using theFormatters.JsonFormatter.SerializerSettings  ...

  9. 常用的sql server规范

    常见的字段类型选择1.字符类型建议采用varchar/nvarchar数据类型2.金额货币建议采用money数据类型3.科学计数建议采用numeric数据类型4. 自增长标识建议采用bigint数据类 ...

  10. javascript高级知识点——实例类型

    代码信息来自于http://ejohn.org/apps/learn/. 分析一下对象的结构 function Ninja(){} var ninja = new Ninja(); console.l ...