如果在交换案例中为其他

问题描述

int flag = 0;
char a = 'b';
switch(a) {
  case 'a':
    cout << "In a";
    break;
  if(flag!=0) {
    case 'b':
      cout << "In b";
      break;
  }
  case 'c':
    cout << "In c";
    break;
  default:
    cout << "In d";
}

有人可以解释为什么上面的代码打印“ In b”吗? 据我了解,它应该打印“ In d”

解决方法

因为case 'a':实际上是标签,控制流在switch (a)上被重定向到该标签。除了不能修改编译时结构外,if语句不能仅仅由于上述语义而导致事前无法到达而阻止这种重定向。

,

switch case机制类似于goto,如果您查看汇编代码here,则将其跳转到相关的case,您会发现它转换为CMP, jmp或je命令