0

在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

4 回答 4

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同样,无法到达对该函数的调用。

请注意“不确定值”注释。


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

于 2013-07-19T14:50:18.680 回答
2

b没有被初始化。把它放在 switch 语句之外。

于 2013-07-19T14:51:27.673 回答
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,但它永远不会被初始化。

于 2013-07-19T14:58:08.577 回答
2

里面switch statement什么都不会像assigning values to the variable and一样被接受printing except inside case。如果您希望 b 值将其分配在 switch 之外。b 值也应该像垃圾值一样,直到将某些值分配给特定位置才能更改。

于 2013-07-19T15:07:58.580 回答