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

yas*_*ash 3 c label compiler-errors switch-statement logical-and

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

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

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

Jab*_*cky 5

表达式'a' && 1'b' && 1都有值1

因此,您的代码与此严格等效:

...
switch(c){
    case 1: printf("Hello");
    case 1: printf("hey");
                   break;
         default : printf("Goodbye");
          }
}
...
Run Code Online (Sandbox Code Playgroud)

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