解释这个C程序的输出

时间:2013-07-19 14:48:17

标签: c initialization

C Puzzles找到此代码。

#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;
}

输出:

 b is 51

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

4 个答案:

答案 0 :(得分:13)

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

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

  

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

     

7示例在人工程序片段中

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

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

请注意“不确定值”评论。


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

答案 1 :(得分:2)

b未初始化。把它放在switch语句之外。

答案 2 :(得分:2)

#include<stdio.h>
int main()
{
    int a = 1;
    switch(a) {   
        int b=20;
        printf("This gets called!\n");
        case 1: 
                printf("b is %d\n",b);
                break;
        default:
                printf("b is %d\n",b);
                break;
    }
    return 0;
}

这里的关键是int b=20;永远不会被调用。编译器将创建变量b,但它永远不会被初始化。

答案 3 :(得分:2)

switch statement内,我们不会接受assigning values to the variableprinting except inside case这样的内容。如果你想b值将它分配给开关外面。另外,b值应该像垃圾值一样,在将某些值分配给特定位置之前不能更改。