切换块

时间:2017-08-30 09:14:14

标签: c scope switch-statement

#include <stdio.h>

int main()
{
        int expr = 0;

        switch (expr)
        {
                int i;

                case 0:
                        i = 17;
                default:
                        printf("%d\n", i);
        }
        return 0;
}

在上面的代码中,变量i在switch case block中声明并打印成默认情况。使用以下命令在linux平台上的GCC编译器中编译。

gcc -Wall switch.c 

并且打印输出正确。

那么,是定义了行为还是未定义的行为?

1 个答案:

答案 0 :(得分:4)

在这种情况下,它不是未定义的行为。

对于case 0expr == 0,这是您的情况),{em} 之前会为i分配一个值(正在读取值)。< / p>

好的,再详细说明一下,对于片段

switch (expr)
    {
            int i;

            case 0:
                    i = 17;
            default:
                    printf("%d\n", i);
    }

只是在块作用域中定义变量i。即使代码将被写为

            int i = 0; //or any value

i的值未初始化,只是标识符在范围内可见。在使用它之前,您必须有另一个语句为i赋值。

在这方面,C11标准有一个非常有启发性的例子和描述。让我引用它,来自章节§6.8.4.2/ P7

  

示例在人工程序片段中

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

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