C++ C/C+中的案例标签问题+;

C++ C/C+中的案例标签问题+;,c++,c,label,case,C++,C,Label,Case,我遇到了这个密码 #include<stdio.h> int main() { int a=1; switch(a) { int b=20; case 1: printf("b is %d\n",b); break; default:printf("b is %d\n",b); break; } r

我遇到了这个密码

  #include<stdio.h>
  int main()
  {
      int a=1;
      switch(a)
      {   int b=20;
          case 1: printf("b is %d\n",b);
                  break;
          default:printf("b is %d\n",b);
                  break;
      }
      return 0;
  }
#包括
int main()
{
INTA=1;
开关(a)
{int b=20;
案例1:printf(“b是%d\n”,b);
打破
默认值:printf(“b是%d\n”,b);
打破
}
返回0;
}
我期望输出为20,但得到了一些垃圾值。
当代码被编译为.c文件和.cp文件?

C++时,代码会出现错误,因为代码跳转到<代码>案例1 < /COD>跨初始化<代码> B<代码>。你不能那样做

在C语言中,由于使用了未初始化的变量
b
,代码调用UB

C99[6.4.2/7]也显示了一个类似的示例

艺术节目片段中的示例

switch (expr)
{
   int i = 4;
   f(i);
   case 0:
     i = 17;
     /* falls through into defaultcode  */
   default:
     printf("%d\n", i);
}
标识符为i的对象存在时具有自动存储持续时间(在块内),但从未初始化,因此,如果控制表达式具有非零值,则对printf函数的调用将访问不确定值。同样,无法调用函数
f


这不是一个编程难题,就是一个令人发指的bug

开关
的作用类似于计算的
转到
。所以它要么
goto 1
转到默认值。在任何一种情况下,它都会跳过
b=20并打印未初始化的垃圾值


一个C++编译器应该通过拒绝编译来改善情况。

< P>执行流程永远不会达到<代码> int b=20;<代码>,因此您将获得未初始化的值b(由于编译器如何分配堆栈变量,它仍然在堆栈上分配)


对于要到达的赋值,它必须位于case语句中或开关的外部和上方(我很惊讶编译器没有发出关于无法访问代码的警告…。

否,
int b=20
语句没有实际执行,因为您跳过了它

不过,我希望您的编译器对此发出警告。

如果您使用的是“gcc”Linux编译器,请使用
-Wall
选项对其进行编译以检查是否存在此问题。case块中的任何内容,除了“case语句”都不会理想地执行。但是它在C/C++中是如何工作的,您的答案在很大程度上取决于您使用的编译器类型。正如我在上面所说的那样,
intb=20
永远不应该被达到,因此当您打印它时,垃圾值的结果也是如此

还有一件事,在这种情况下,最好让我们知道您正在使用的编译器的类型和版本,以获得更准确的答案