飞道的博客

C语言switch你不知道的一些事情

264人阅读  评论(0)

C语言switch你不知道的一些事情


C语言switch的“BUG”

先抛出一个问题,下面的code运行结果是什么?

#include<stdio.h>

int main()
{
   
	int a=2;
	
	switch(a)
	{
   
		a=3;
		case 2:
			printf("a is %d.\n",a);
			break;
			
		case 3:
			printf("a is %d.\n",a);
			break;
			
		default:
			break;
	} 
	
	return 0;
}

运行结果如下👇

为什么会是2呢?

因为C语言会忽视(ignore) switch语句与第一个case之间的code,也就是根本没有执行 “a=3;”这条语句

所以同学们之后一定要注意不要在switch语句与第一个case之间加任何code


switch的default只能放在最后吗?

答案不是的,其实可以放在switch的任何位置,Demo code如下👇

#include<stdio.h>

int main()
{
   
	int a=2;
	
	switch(a)
	{
   
		default:
			printf("Not matching any cases.\n");
			break;
			
		case 2:
			printf("a is %d.\n",a);
			break;
			
		case 3:
			printf("a is %d.\n",a);
			break;
	} 
	
	return 0;
}

运行结果如下👇


switch的case中可以声明变量吗?

可以的,但是case之后紧邻的下一条语句不能是变量声明语句,否则编译会报错,Error code如下👇

#include<stdio.h>

int main()
{
   
	int a=2;
	
	switch(a)
	{
   
		case 2:
			int b=3;
			printf("a+b is %d.\n",a+b);
			break;	
	
		case 3:
			printf("a is %d.\n",a);
			break;
			
		default:
			printf("Not matching any cases.\n",a);
			break;
	} 
	
	return 0;
}

编译报错

[Error] a label can only be part of a statement and a declaration is not a statement

正确code1如下👇

#include<stdio.h>

int main()
{
   
	int a=2;
	
	switch(a)
	{
   
		case 2:
			; //加一个‘;’表示插入一个空语句
			int b=3;
			printf("a+b is %d.\n",a+b);
			break;	
	
		case 3:
			printf("a is %d.\n",a);
			break;
			
		default:
			printf("Not matching any cases.\n",a);
			break;
	} 
	
	return 0;
}

正确code2如下👇

#include<stdio.h>

int main()
{
   
	int a=2;
	
	switch(a)
	{
   
		case 2:
		//加入一对花括号,变成一个语句块
		{
   
			int b=3;
			printf("a+b is %d.\n",a+b);
			break;	
		}
	
		case 3:
			printf("a is %d.\n",a);
			break;
			
		default:
			printf("Not matching any cases.\n",a);
			break;
	} 
	
	return 0;
}

C语言的“bug”隐式类型转换
C语言GOTO你不知道的一些事情



转载:https://blog.csdn.net/qq_31985307/article/details/116107392
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场