switch的三个注意点

第一点

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

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的初始化步骤。


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





<think>好的,我现在需要解决用户在C/C++代码中遇到的语法错误问题,具体是关于case语句中使用&#39;0&#39;...&#39;9&#39;的写法。首先,我应该回想一下用户提供的代码示例和之前的回答。用户之前给出的代码中有这样的片段: case &#39;0&#39;...&#39;9&#39;: // 调速0-9级 这看起来像是用来处理从字符&#39;0&#39;到&#39;9&#39;的所有情况的case语句。不过,根据我的知识,C/C++的switch-case语法并不支持这种范围写法,比如使用&#39;0&#39;...&#39;9&#39;。这可能就是用户遇到语法错误的原因。 接下来,我需要确认C/C++的标准是否真的不支持这种写法。在C语言中,case标签必须是整型常量表达式,不允许使用范围。C++同样遵循这一。因此,用户尝试的&#39;0&#39;...&#39;9&#39;写法在标准C/C++中是无效的,会导致编译错误。 用户可能参考了某些编译器扩展,比如GCC的扩展语法,允许使用case &#39;0&#39; ... &#39;9&#39;这样的范围写法。但需要注意的是,这种写法并不是标准C/C++的一部分,依赖于特定编译器,如GCC或Clang,可能在其他编译器如MSVC中无法通过编译。因此,用户在使用这种写法时需要注意编译器的兼容性问题。 接下来,我需要考虑如何正确地在C/C++中处理多个连续的case值。标准做法是为每个字符单独列出case,或者使用if-else结构来判断范围。例如,可以写成: case &#39;0&#39;: case &#39;1&#39;: ... case &#39;9&#39;: // 处理代码 break; 但这样手动列出每个case会比较繁琐,特别是当范围较大时。另一种方法是利用字符的ASCII值特性,将字符转换为数值后,判断是否在某个区间内。例如,在switch外部使用if语句: if (cmd >= &#39;0&#39; && cmd <= &#39;9&#39;) { // 处理代码 } 或者在switch语句内部使用default标签,结合条件判断来处理范围情况。例如: default: if (cmd >= &#39;0&#39; && cmd <= &#39;9&#39;) { // 处理代码 } else { // 其他情况 } break; 此外,用户提到的问题可能与编译器有关,所以需要指出编译器扩展的存在,同时提醒用户注意代码的可移植性。例如,GCC允许使用case ranges的扩展,但这不是标准,需谨慎使用。 总结来说,解决方案包括两种:一种是标准方法,逐个列出case标签;另一种是使用条件判断来处理范围。同时,可以提及编译器扩展的存在,但需注意兼容性。 最后,需要确保回答结构清晰,分说明问题原因和解决方案,并给出示例代码,帮助用户理解和应用。此外,生成相关的问题可以进一步帮助用户深入理解问题,比如关于switch-case的其他常见错误或编译器扩展的使用注意事项。</think>以下是针对C/C++中`case &#39;0&#39;...&#39;9&#39;`语法错误的详细解决方案: --- ### 一、问题本质分析 1. **语法标准冲突** C/C++标准规定`case`标签必须是**独立的整型常量表达式**,不支持范围语法`...`。代码中的`case &#39;0&#39;...&#39;9&#39;`属于GCC编译器扩展语法[^2],在标准编译环境(如MSVC)中会报错。 2. **ASCII码特性** 字符`&#39;0&#39;-&#39;9&#39;`在ASCII表中连续排列(对应十进制值48-57),可利用此特性实现范围判断。 --- ### 二、标准C/C++解决方案 #### 方法1:显式列出所有case ```cpp switch(cmd) { case &#39;0&#39;: case &#39;1&#39;: case &#39;2&#39;: case &#39;3&#39;: case &#39;4&#39;: case &#39;5&#39;: case &#39;6&#39;: case &#39;7&#39;: case &#39;8&#39;: case &#39;9&#39;: pwm_duty = (cmd - &#39;0&#39;) * 10; break; // 其他case... } ``` **优**:完全符合标准,所有编译器支持 **缺**:代码冗长,维护成本高 #### 方法2:条件判断替代 ```cpp switch(cmd) { default: if(cmd >= &#39;0&#39; && cmd <= &#39;9&#39;) { // 利用ASCII连续性 pwm_duty = (cmd - &#39;0&#39;) * 10; } else { // 处理其他情况 } break; } ``` **优**:代码简洁,逻辑清晰 **缺**:需要配合`default`使用 --- ### 三、编译器扩展方案(慎用) GCC/Clang支持范围语法(需启用扩展): ```cpp case &#39;0&#39; ... &#39;9&#39;: // 注意空格规范 ``` **编译参数**(GCC): ```bash -std=gnu++11 # 启用GNU扩展 ``` **风险提示**:该写法在MSVC等严格遵循ISO标准的编译器中会报错[^2] --- ### 四、性能对比 | 方法 | 编译兼容性 | 代码可读性 | 执行效率 | |------------|------------|------------|----------| | 显式列出 | ★★★★★ | ★★☆☆☆ | 相同 | | 条件判断 | ★★★★★ | ★★★★☆ | 略低 | | 编译器扩展 | ★★☆☆☆ | ★★★★★ | 相同 | --- ### 五、最佳实践建议 1. **跨平台项目** 使用显式列出法,确保兼容性: ```cpp case &#39;0&#39;: case &#39;1&#39;: /* ... */ case &#39;9&#39;: ``` 2. **单片机开发** 若确认编译器支持扩展语法,可添加版本控制: ```cpp #if defined(__GNUC__) || defined(__clang__) case &#39;0&#39; ... &#39;9&#39;: #else // 标准实现 #endif ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值