c 语言switch 括号,C 语言语法系列(4):switch 语句

66b52468c121889b900d4956032f1009.png

8种机械键盘轴体对比

本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?

文章目录

if 的弊端

很多时候,if 给我们的使用带来了方便的地方,但是依旧有点丑的是,我们经常会用到同一个变量分情况讨论的时候,但 if 非要写成 if 串联的模式,这样就很丑。于是,我们引入了新的语法格式:switch 语句。

switch 语句的写法

考虑如下 if 串联写法。1

2

3

4

5

6

7

8

9

10if (a == 2)

c = 1;

else if (a == 3)

c = 2;

else if (a == 4)

c = 4;

else if (a == 5)

c = 8;

else

c = 16;

当我们需要判断相同的一个变量的不同数值时,我们可以考虑使用 switch 语句来书写,它在转换后是这样的:1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18switch (a)

{

case 2:

c = 1;

break;

case 3:

c = 2;

break;

case 4:

c = 4;

break;

case 5:

c = 8;

break;

default:

c = 16;

break;

}

从代码里看到,它可能比原本的写法更臃肿了,但代码更清晰了。按照 a 分情况讨论。当 a 值为 2 的时候,执行 c = 1 的赋值操作;其它的同理。default 用来控制其它所有情况,类似于 if 里的 else 条件后没有其它判别情况时的执行操作。

还需要注意的是,每一个 case 语句的最后都有一个冒号,而且在每一个部分结束的时候,都有一个 break 语句作为结束(写法必须是 break;,即末尾带分号)。这是两个需要注意的地方。

另外,标签之间必须书写 break 是有道理的。如果不写它的话,语句就会贯穿到下一个部分去执行,所以不是非常好。但有些时候,我们也可以考虑使用这种特性来做事情。比如,我们获取 12 个月每一个月多少天的时候,可以这么写:1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24switch (month)

{

case 1:

case 3:

case 5:

case 7:

case 8:

case 10:

case 12:

printf("31n");

break;

case 2:

printf("28n");

break;

case 4:

case 6:

case 9:

case 11:

printf("30n");

break;

default:

printf("Month value is not valid.n");

break;

}

我们暂且不考虑闰年还是平年,2 月分情况讨论的结果。这样的写法可以看到,像是 1、3、5、7、8、10、12 月,结果都是一样的,所以我们完全不必在中间给它加上 break。

当然,default 不一定要放在最后面。有些时候我们可能期望默认执行的情况和其中某个数值的执行情况是一样的,这个时候我们可以把 default 调整到前面去。

比如,我们需要在记录成绩等级(A 到 F)的时候,默认把其它情况和不及格显示成一样的结果(F),我们就可以这么做:1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28int score = 67;

switch (score / 10)

{

default:

case 0:

case 1:

case 2:

case 3:

case 4:

case 5:

printf("Fn");

break;

case 6:

printf("En");

break;

case 7:

printf("Dn");

break;

case 8:

printf("Cn");

break;

case 9:

printf("Bn");

break;

case 10: // Only for 100.

printf("An");

break;

}

注意,switch 的小括号里的东西可以是任意一个整数数值的表达式,比如这个例子里的值就是 score / 10,算出来等于 6。注意,之前说过,67 和 10 都是整数,所以计算的除法一定得到的结果是整数,故得到的 6.7 会被截断为 6,而且截断不是四舍五入。

贯穿标签的用法

在前文里,所有 case 语句 default 都被称为标签。当有些时候,我们迫不得已需要贯穿标签,所以出现了前文的合并同类项的类似格式。但有些时候,我们除了这种贯穿模式之外,还有一种情况可以这么用,即不写 break 语句。

给定 month 数值表示当前月份,求从 1 月份到这个月一共多少天(暂不考虑日期是多少)。那么代码可以这么写:1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30switch (month)

{

case 12:

result += 31;

case 11:

result += 30;

case 10:

result += 31;

case 9:

result += 30;

case 8:

result += 31;

case 7:

result += 31;

case 6:

result += 30;

case 5:

result += 31;

case 4:

result += 30;

case 3:

result += 31;

case 2:

result += 28;

case 1:

result += 31;

break; // Note this break sentence.

default:

result = 0; // We use 0 to let user know his input value is invalid.

}

你可以思考一下,为什么这种模式可以不写 break 语句。

缺乏不等模式判断

switch 有一个缺点在于,它没有不等模式的判别,比如我们希望某个数字在 0 到 60 的时候是差, 61 到 80 的时候是中等,81 到 90 的时候是良好,91 到 100 是优秀。这个时候,我们只能使用 if 语句的串联,switch 很抱歉的是,在这一点并没有提供对应的语法判别。1

2

3

4

5

6

7

8if (score <= 60)

printf("Badn");

else if (score <= 80)

printf("Not badn");

else if (score <= 90)

printf("Awesome!n");

else

printf("Excellent!!n");

上述即可判断。你需要思考一点,为什么 if 判别里写的是 score <= 某数值 呢?比如 61 到 80,不应该写成 score >= 61 && score <= 80 才对吗?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值