现在的位置: 首页 > 综合 > 正文

switch的三个注意点

2014年09月05日 ⁄ 综合 ⁄ 共 1344字 ⁄ 字号 评论关闭

第一点

看别人代码时容易忘记这个知识点,影响理解。

switch ( pElements->Rule.ulId )
        {
		case VID_Hello:
		case VID_Stops:
		case VID_Out:
                case VID_Navigation:
                {
                    ……
                    break;
                }
		case VID_Place:
		{
                    ……               

                    break;
		}
                ……
        }
        // Free the pElements memory which was allocated for us
        ::CoTaskMemFree(pElements);
    }

在执行switch语句时,根据switch后面的表达式的值找到匹配的入口标号,就从此标号开始执行下去,直到遇到break;或者return;当多个分支有统一的处理逻辑时就可以统一处理。

第二点 

不能匹配字符串

第三点

这个知识点修改几次了,还是学到了些东西的,如下:

  • 在块作用域{}内声明的变量,出了}就不在起作用。对于{},可能用的更多的是跟在函数名后面/编程语言本书if(){}else{}等结构。也可以这样用:
    {
    	int i=0;
    	printf("%d\n",i);  // 仅以此代表你要做的事,在这件事里i是一个重要的临时变量
    }
    	
    {
    	int i=11;
    	printf("%d\n",i);  // 仅以此代表你要做的事,在这件事里i是一个重要的临时变量
    }
  • C语言是不允许在中间声明变量的,这点不知道最新的标准是不是更新了,有点用最新标准测试,sorry,最近才想到,新标准测试环境搭好。
  • 对于这段代码:
    for(int i=0;i<10;i++)
    { 
    	printf("%d\n",i);
    }

    ·C语言编译会出现如下错误提示:把int i=0;提到for语句前就OK。
    ·C++是OK的。

代码描述-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

C:在u分支中加{},或者把char t2的声明放在switch语句前就OK,C++:在u分支中加{},把char
t2的声明放在switch语句前
或者把default分支去掉就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;
}

编译错误

把{int b=20;}外的大括号去掉后,编译通过,但是编译警告:

输出的b的值是未知的。这样看来,这种情况下只是跳过了b的初始化步骤。

在CSDN论坛上发了个帖子,大家的回答还是给了我很多提示的。不得不承认自己是菜鸟的事实,这么简单的问题都没想到。帖子链接



抱歉!评论已关闭.