繁体   English   中英

在 switch 语句中的 case 内具有相同的表达式

[英]Having same expression inside case in switch statement

int main(){
char c='a';
switch(c){
    case 'a' && 1: printf("Hello");
    case 'b' && 1: printf("hey");
                   break;
         default : printf("Goodbye");
          }
}

当我编译这段代码时,结果是“编译错误”,这(据我说)是因为在内部这两个表达式都是真的,因此对于我们为“c”取的任何字符,这两种情况下的常量表达式都将始终为真.

但现在出现了我无法理解的疑问,代码如何在内部解释以及编译器如何实际解释这段代码?

两个表达式'a' && 1'b' && 1的值都是1

因此,您的代码严格等同于:

...
switch(c){
    case 1: printf("Hello");
    case 1: printf("hey");
                   break;
         default : printf("Goodbye");
          }
}
...

因此出现错误消息,因为两个或多个案例标签不能具有相同的值。 C 语言不允许这样做。

case 表达式'a' && 1'b' && 1都计算为 1,因为在这两种情况下每个操作数都不为零。

这意味着您有两个具有相同值的案例,这是不允许的。

对于符合 C 标准的初学者(6.8.4.2 switch 语句)

3 每个case标签的表达式应为整数常量表达式,同一switch语句中的任何两个case常量表达式转换后的值不得相同

在这种情况下标签

case 'a' && 1: printf("Hello");
case 'b' && 1: printf("hey");

使用了logical AND运算符。 根据 C 标准(6.5.13 逻辑与运算符)

3 如果 && 运算符的两个操作数比较不等于 0,则 && 运算符将产生 1; 否则,它产生 0。结果具有 int 类型。

由于字符整数文字'a''b'以及整数文字1不等于0 ,因此两个表达式at compile time计算为相同的整数值1

所以事实上你有

case 1: printf("Hello");
case 1: printf("hey");

因此,两个 case 标签在同一个 switch 语句中具有相同的常量整数表达式。 所以编译器发出错误。

使用包含等于1的操作数的logical AND运算符

case 'a' && 1: printf("Hello");
case 'b' && 1: printf("hey");

没有意义。

也许您的意思是以下标签

case 'a' & 1: printf("Hello");
case 'b' & 1: printf("hey");

这是带有bitwise AND运算符的标签。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM