解释这个C程序的输出

mle*_*boy 0 c initialization

C拼图中找到此代码.

#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)

输出:

 b is 51
Run Code Online (Sandbox Code Playgroud)

似乎无法理解这个输出..

Jon*_*ler 13

您通过跳过变量的初始化来使用具有不确定值的变量(调用未定义的行为)b.该程序可以产生任何值,它将是正确的.

C标准甚至涵盖了这种情况(在一个非规范的例子中).

ISO/IEC 9899:2011§6.8.4.2 switch声明:

7示例在人工程序片段中

switch (expr)
{
        int i = 4;
        f(i);
    case 0:
        i = 17;
        /* falls through into default code */
    default:
        printf("%d\n", i);
}
Run Code Online (Sandbox Code Playgroud)

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

请注意"不确定值"注释.


关于访问不确定值是否会导致未定义的行为,还有一些讨论空间.在某些情况下(陷阱表示),它可能导致未定义的行为.我需要一些时间来确定"可能未定义的行为"是否应被视为"未定义的行为".访问未初始化的变量是一个坏主意,并且您无法对代码中打印的值进行任何说明.

  • 未定义的行为可以做它想要的,包括每次都给你相同的输出. (3认同)