在 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,因为在这两种情况下每个操作数都是 non-zero.

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

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

3 The expression of each case label shall be an integer constant expression and no two of the case constant expressions in the same switch statement shall have the same value after conversion

在这种情况下标签

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

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

3 The && operator shall yield 1 if both of its operands compare unequal to 0; otherwise, it yields 0. The result has type int.

由于字符整数文字 'a''b' 以及整数文字 1 不等于 0 那么两个表达式的计算结果都是相同的整数值 1 at compile time.

所以事实上你有

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 运算符的标签。