奇怪的switch,求解释解决方法

奇怪的switch,求解释
本帖最后由 dscyw 于 2014-05-15 12:05:49 编辑
代码描述-1
    #include <stdio.h>  
    int main(void)    
    {       
        char c = 't' ;  
        switch( c ){  
        case 't':  
            printf("Case t\n");  
            break;  
        case 'u':  
            char t2 = '2';  
            printf("t2:%c\n",t2);  
            break;  
        default:  
            printf("This is default.\n");  
            break;  
        }  
        return 0;  
    }  
编译错误:测试环境 Visual Studio 2010 Win32Console
奇怪的switch,求解释解决方法
在u分支中加{},或者把char t2的声明放在switch语句前就OK。这应该跟编译器的编译原理有关,这是什么机制呢,或者是C/C++标准的一个什么规则?有待解决。这样看来,最好在每个分支中都加{}。

代码描述-2
 #include <stdio.h>  
    int main(void)    
    {        
        int a=1;        
        switch(a)        
        {       
            {int b=20;}    
        case 1:   
            printf("b is %d\n",b);  
            break;  
        default:  
            printf("b is %d\n",b);  
            break;  
        }  
        return 0;  
    }  
  编译错误:
奇怪的switch,求解释解决方法
把{int b=20;}外的大括号去掉后,编译通过,但是有编译警告:
奇怪的switch,求解释解决方法
输出的b的值是未知的。这样看来,这种情况下只是把跳过了b的初始化步骤。
------解决方案--------------------
{int b=20;}加{}后,这个变量就变成块变量了,作用域在这个块内,出了块就没用了。不加{}switch语句不要声明变量
------解决方案--------------------
你的文件“main.c”扩展名是.c,所以按C方式来编译,c语言是不允许在中间定义参数
    #include <stdio.h>  
    int main(void)    
    {       
      char t2;   //定义放前面来     
      char c = 't' ;  

        switch( c ){  
        case 't':  
            printf("Case t\n");  
            break;  
        case 'u':  
            t2 = '2';  
            printf("t2:%c\n",t2);  
            break;  
        default:  
            printf("This is default.\n");  
            break;  
        }  
        return 0;  
    } 
------解决方案--------------------
switch(a)
{
  case 0 : 
              {//需要定义变量的话,要加括号,标示变量的可见范围。
               //如果不加,就是switch语句整个可见,此时需要在switch外部 定义。