今天在编写C代码的时候,碰到了一个以前没有碰到过的switch case语句中定义变量出错问题。
问题大概是这样的,看下面这个代码,它在case中定义了一个变量,然后报错了:
#include
int main(int argc, char const *argv[])
{
int a = 1;
switch(a)
{
case 0:
int m;//报错,a label can only be part of a statement and a declaration is not a statement
//这句话的意思是说,标签只能是statement语句的一部分,而declaration声明不是一个statement语句。
printf("----0----
");
break;
case 1:
printf("----1----
");
break;
default:
printf("----2----
");
break;
}
return 0;
}
这句话的意思是说,标签只能是statement语句的一部分,而declaration声明不是一个statement语句。
在C99标准中,case和default都是标签语句,他们后面必须得跟上statement。
关于label:
从C99标准目录中也可以看出来declaration和statement不是一个东西。
关于declaration和statement:
statement包括以下几种,所以在case后直接定义变量的做法是不允许的。
关于statement:
为了解决上面这个问题,聪明的网友们提出了多种方法:反正本质都是让case后面的内容变成一个statement。
方法一:case后面直接接上一个空语句";"之后,再定义变量
#include
int main(int argc, char const *argv[])
{
int a = 1;
switch(a)
{
case 0:
;
int m=10;//不报错,连警告都没有
printf("----0----
");
break;
case 1:
printf("----1----
");
break;
default:
printf("----2----
");
break;
}
return 0;
}
方法二:加"{ }",把case后面语句包括起来
#include
int main(int argc, char const *argv[])
{
int a = 0;
switch(a)
{
case 0:
{
int m=10;
printf("----0----
");
break;
}
case 1:
printf("----1----
");
break;
default:
printf("----2----
");
break;
}
return 0;
}
而关于网上其他人说的,变量作用域解释到底有没有道理了?
最后补充一点,在switch和case直接写语句,没有意义,因为它执行不到。
#include
int main(int argc, char const *argv[])
{
int a = 0;
switch(a)
{
printf("hello world
");//执行不到
case 0:
{
int m=10;
printf("----0----
");
break;
}
case 1:
printf("----1----
");
break;
default:
printf("----2----
");
break;
}
return 0;
}
留言与评论(共有 0 条评论) “” |