在开关块内声明的变量

这个问题在这里已经有了答案:

  • switch语句中的变量定义5个答案
  • 变量定义在C中忽略[重复] 7个答案
  • 为什么不能在switch语句中声明变量? 23个答案

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

    对于case 0 (当expr == 0 ,这是你的情况), i被赋值之前被使用(正在读取的值)。


    好的,详细阐述一下这个片段

    switch (expr)
        {
                int i;
    
                case 0:
                        i = 17;
                default:
                        printf("%dn", 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("%dn", i);
    }
    

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

    链接地址: http://www.djcxy.com/p/14799.html

    上一篇: Declared variable within a switch block

    下一篇: Initializing variables (int32) inside switch statement