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
查看评论