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

use*_*619 4 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;
      }
      return 0;
  }
Run Code Online (Sandbox Code Playgroud)

我预计输出为20但有一些垃圾值.将此代码编译为.c文件和.cpp文件时输出是否会不同?

Pra*_*rav 8

在C++中,代码格式不正确,因为跳转到了case 1初始化b.你不能这样做.

在C中,代码调用UB是因为使用了未初始化的变量b.

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);
}
Run Code Online (Sandbox Code Playgroud)

标识符为i的对象存在自动存储持续时间(在块内)但从未初始化,因此如果控制表达式具有非零值,则对printf函数的调用将访问不确定的值.同样,无法访问函数调用f.