switch case中变量定义问题

今天在编写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;
}
switch case中变量定义问题

这句话的意思是说,标签只能是statement语句的一部分,而declaration声明不是一个statement语句。

在C99标准中,case和default都是标签语句,他们后面必须得跟上statement。

关于label:

switch case中变量定义问题

从C99标准目录中也可以看出来declaration和statement不是一个东西。

关于declaration和statement:

switch case中变量定义问题

statement包括以下几种,所以在case后直接定义变量的做法是不允许的。

关于statement:

switch case中变量定义问题

为了解决上面这个问题,聪明的网友们提出了多种方法:反正本质都是让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中变量定义问题

最后补充一点,在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;
}
switch case中变量定义问题

发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章