switch中case中变量定义的问题

今天写C代码时在case中定义了变量变异处错误,代码如下

#include <stdio.h>

int main()
{
  int n;
  scanf("%d", &n);
  switch(n){
    case 0:
      printf("it's 0\n");
      break;
    case 1:
      int i = 2;
      printf("it's 1, i = 2\n");
      break;
  }
  return 0;
}

使用GCC编译出现:12:7: 错误: 标号只能是语句的一部分,而声明并非语句。

但是修改了一下,如下

#include <stdio.h>

int main()
{
  int n;
  scanf("%d", &n);
  switch(n){
    case 0:
      printf("it's 0\n");
      break;
    case 1:
      {
        int i = 2;
        printf("it's 1, i = 2\n");
      }
      break;
  }
  return 0;
}
此时编译通过了,结果也正确。

下面是个人理解:

由于switch的几个case语句在同一个作用域(因为case 语句只是标签,它们共属于一个swtich语句块),所以如果在某个case下面声明变量的话,其他的case语句也能看到,这样的话就可能导致错误,例如在地一段代码中的case 1后面还有个case 2的话,且case 2中使用了case 1定义的变量i的话,那么如果运行时n = 2,switch直接跳转到case2内部,这样就出现了i没有初始化的事情了(变量的声明是在编译阶段,而变量的赋值则是在运行时),如果能够运行的话,则在case 2中,i的初始值将是一个未知值。所以编译器直接避免这种事情的发生,就让其编译无法通过。

而很明显加上花括号之后,i的作用域就很明确了。


另外,switch(expression)其中expression的结果必须是整型(字符、短整、长整),case constant-expression中constant-expression必须是一个整型值,不能是任何表达式。

文章参考了别人的提问及相关解答(http://bbs.csdn.net/topics/390026156)。


  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值