switch 语句中的逗号运算符是什么意思?
这意味着你有一个旧的编译器。
编辑帖子(显示case range
示例)
前两个示例(包括您的原始代码)显示了不正确的 switch 语句语法(带有解释)。第三个代码示例显示了如何正确堆叠大小写标签:
在您的代码中,编译器应该在 case 1,
<--之后标记了第一个逗号
#include <ansi_c.h>
int main(void){
int x = 2;
switch(x)
{
case 1,2,1: printf("Case 1 is executed");
break; //error flagged at first comma, and all comma after in case
case 2,3,1: printf("Case 2 is executed");
break;
default : printf("Default case is executed");
}
return 0;
}
而且,即使这样修改,您也应该得到重复标签错误:
#include <ansi_c.h>
int main(void){
int x = 2;
switch(x)
{
case 1:
case 2:
case 1: printf("Case 1 is executed"); //duplicate label 1 error. (and others below)
break;
case 2:
case 3:
case 1: printf("Case 2 is executed");
break;
default : printf("Default case is executed");
}
return 0;
}
这个例子是完全合法的(C99,C11)并且有用:即,没有重复的标签,并且语法通过堆叠唯一标签来处理case 1: OR case 2: OR case 3:
应该以相同方式处理的条件(在同一个块中),从而符合正确的开关用法. 当然,情况 4、5 和 6 也是如此。
#include <ansi_c.h>
int main(void){
int x = 2;
switch(x)
{
case 1:
case 2:
case 3: printf("Case 1,2 or 3 is executed"); //duplicate label 1 error. (and others below)
break;
case 4:
case 5:
case 6: printf("Case 4,5 or 6 is executed");
break;
}
getchar();
return 0;
}
最后一个示例只是为了完整性。它说明了case range
表达式。尽管引起了 C 程序员的兴趣,但它还不是 C99 或 C11 的一部分,而是 Sun(一种 unix 风格)和 GNU C 编译器 (等)的扩展:
...
switch(x)
{
case 'a' ... 'z': //note: spaces between all characters ('a') and ellipses are required
printf("lowercase alpha char detected");
break;
case 'A' ... 'B':
printf("uppercase alpha char detected");
break;
default: printf("Default case is executed");
}
...
您看到从一个编译器到另一个编译器的模棱两可结果的原因可能是 Turbo C 真的很老了。您正在使用的版本可能是针对不再适用的 C 标准版本实施的。
考虑更改为当前的编译器。一个便宜(免费)的替代品是MinGW。MinGW 是一个维护良好的开源编译器。如果您喜欢使用集成开发环境 (IDE),Code::Blocks是一个选项,也是免费的,并且作为选项与 MinGW 捆绑在一起。
关于兼容性,请在此链接中搜索与其他编译器套件的比较以了解 MinGW 扩展。MinGW 扩展在扩展功能的同时,有时会使使用它们编写的代码与其他当前编译器不可移植。建议在使用时谨慎使用。