第一点
看别人代码时容易忘记这个知识点,影响理解。
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,最近才想到,新标准测试环境搭好。
- 对于这段代码:
·C语言编译会出现如下错误提示:把int i=0;提到for语句前就OK。for(int i=0;i<10;i++) { printf("%d\n",i); }
·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的初始化步骤。
在优快云论坛上发了个帖子,大家的回答还是给了我很多提示的。不得不承认自己是菜鸟的事实,这么简单的问题都没想到。帖子链接