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

本文深入探讨了C语言中switch语句的一些不为人知的特性。首先,解释了为什么示例代码中变量a的值为2,原因是switch忽略其与第一个case之间的代码。接着,澄清了default子句可以放置在switch的任意位置,并通过示例进行了演示。此外,讨论了在case中声明变量的问题,指出必须避免直接声明,可以通过添加空语句或使用语句块来解决。这些知识点对于理解和避免C语言编程中的陷阱至关重要。
摘要由CSDN通过智能技术生成

本人就职于国际知名终端厂商,负责modem芯片研发。
在5G早期负责终端数据业务层、核心网相关的开发工作,目前牵头6G算力网络技术标准研究。

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你不知道的一些事情


在这里插入图片描述

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

从善若水

原创不易,感谢支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值