C语言关键字浅析-case

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Johan_Joe_King/article/details/83615534

### C语言关键字浅析系列 ###

### ISO/ANSI C 关键字 ###

case语句是C语言中switch开关语句中常用的关键字

将switch语句后的小括号中的变量视为参数

如果下面某一个case后跟的常量与参数相同

则从该case后的代码开始执行

case的作用:

标记switch选择结构中程序开始执行的位置。

对比if-else关键字,case关键字的一大优势是可以按“开关”的思想控制语句开始执行的位置。

但case的一个劣势是,case后的参数需要是int或者char常量,不能是表达式,而if-else可以根据表达式结果判断执行。

/*
	转换地址,不区分大小写
*/
int alterAddress(char c)
{
	int add;
	switch(c)
	{
		case 'a':   /* 如果参数c是'a',程序从此处开始执行 */
		case 'A':   /* 如果参数c是'A',程序从此处开始执行 */
			add = 0x11;
			break;  /* 为了屏蔽其他选项,发挥switch的选择功能,一类处理的最后要写上break跳过后面的执行语句 */
		case 'b':
		case 'B':
			add = 0x12;
			break;
		case 'c':
		case 'C':
			add = 0x13;
			        /* 此处有bug,没有break会导致后面的语句继续执行,也许会造成程序结果错误 */
		case 'd':
		case 'D':
			add = 0x14;
		default:
			add = 0x01;		
	}

        return add;
}

case语句和if-else语句的另一个不同之处在于,case语句都在同一个作用域,case后定义变量可能会出错,比如下面这个例子:

int j;
switch(c)
{
	case 'a':
		int i;   /* 这里编译器可能会报错,因为所有的case在一个作用域,这个i在所有case都可见 */
		i = 0;
	case 'b':
	case 'c':
		j = 2;
		break;
}

解决方案是,用一个{}在case后嵌套一个代码块,强行做一个作用域:

int j;
switch(c)
{
	case 'a':
        {
		int i;   /* 用大括号围成一个代码块,i的作用域就限定在了该代码块内 */
		i = 0;
        }
	case 'b':
	case 'c':
		j = 2;
		break;
}

——参考《C Primer Plus第五版》

猜你喜欢

转载自blog.csdn.net/Johan_Joe_King/article/details/83615534