原文:Exercise 13: Switch Statement
在其它类似Ruby的语言中,switch语句可以处理任意类型的表达式。一些语言比如Python没有switch语句,因为带有布尔表达式的if语句可以做相同的事情。对于这些语言,switch语句比if语句更加灵活,然而内部的机制是一样的。
switch
if
C中的switch语句与它们不同,实际上是一个“跳转表”。你只能够放置结果为整数的表达式,而不是一些随机的布尔表达式,这些整数用于计算从swicth顶部到匹配部分的跳转。下面有一段代码,我要分解它来让你理解“跳转表”的概念:
swicth
#include <stdio.h> int main(int argc, char *argv[]) { if(argc != 2) { printf("ERROR: You need one argument.\n"); // this is how you abort a program return 1; } int i = 0; for(i = 0; argv[1][i] != '\0'; i++) { char letter = argv[1][i]; switch(letter) { case 'a': case 'A': printf("%d: 'A'\n", i); break; case 'e': case 'E': printf("%d: 'E'\n", i); break; case 'i': case 'I': printf("%d: 'I'\n", i); break; case 'o': case 'O': printf("%d: 'O'\n", i); break; case 'u': case 'U': printf("%d: 'U'\n", i); break; case 'y': case 'Y': if(i > 2) { // it's only sometimes Y printf("%d: 'Y'\n", i); } break; default: printf("%d: %c is not a vowel\n", i, letter); } } return 0; }
在这个程序中我们接受了单一的命令行参数,并且用一种极其复杂的方式打印出所有原因,来向你演示switch语句。下面是swicth语句的工作原理:
argv[1]
case 'A'
case
Y + 'A'
Y+letter
Y+Default
break
'a'
case 'a'
译者注:更常见的情况是,gcc会在空白处单独构建一张跳转表,各个偏移处存放对应的case语句的地址。Y不是switch语句的起始地址,而是这张表的起始地址。程序会跳转到*(Y + 'A')而不是Y + 'A'处。
*(Y + 'A')
这是对swicth语句工作原理的一个深究,然而实际操作中你只需要记住下面几条简单的原则:
default:
//fallthrough
下面是我运行它的一个例子,也演示了传入命令行参数的不同方法:
$ make ex13 cc -Wall -g ex13.c -o ex13 $ ./ex13 ERROR: You need one argument. $ $ ./ex13 Zed 0: Z is not a vowel 1: 'E' 2: d is not a vowel $ $ ./ex13 Zed Shaw ERROR: You need one argument. $ $ ./ex13 "Zed Shaw" 0: Z is not a vowel 1: 'E' 2: d is not a vowel 3: is not a vowel 4: S is not a vowel 5: h is not a vowel 6: 'A' 7: w is not a vowel $
记住在代码的开始有个if语句,当没有提供足够的参数时使用return 1返回。返回非0是你提示操作系统程序出错的办法。任何大于0的值都可以在脚本中测试,其它程序会由此知道发生了什么。
return 1
破坏一个switch语句块太容易了。下面是一些方法,你可以挑一个来用:
default
int
你也可以使用一些别的方法使这个程序崩溃。试着看你能不能自己做到它。
','
for
letter
Copyright© 2013-2020
All Rights Reserved 京ICP备2023019179号-8