【问题标题】:Can anyone explain the output of this C program? [duplicate]谁能解释这个 C 程序的输出? [复制]
【发布时间】:2012-06-21 12:19:36
【问题描述】:

可能重复:
Why can't variables be declared in a switch statement?
How can a variable be used when its definition is bypassed?

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

在 gcc 4.6.3 上运行,输出不是 20。这是怎么回事?

【问题讨论】:

    标签: c switch-statement


    【解决方案1】:

    在 switch 语句中初始化变量是不好的做法和未定义的行为。

    【讨论】:

    • 但是变量 b 被声明为 20,编译器知道变量 b 将占用多少空间以及在那里存储什么。为什么行为未定义呢?
    • @Anon:它不是标签的一部分。
    【解决方案2】:

    switch 语句的结构如下:

    switch ( expression ){
    
        // declarations 
    
       case constant-expression : 
          ...
       case constant-expression : 
          ...
       default :
          ...
    }
    

    声明部分在编译时用于声明变量,但在运行时不用于初始化它们(实际上,该部分中没有执行任何语句)。声明和初始化变量之间没有区别。由于b 从未初始化,因此您的代码与以下结果相同:

    int main(){
        int b;
        printf("b is %d\n", b);
    
        return 0;
    }
    

    这显然是未定义的。使用 -Wall 标志编译会发现您正在使用未初始化的值。

    【讨论】:

      【解决方案3】:

      如果您打开编译器警告,您会看到:

      warning: ‘b’ may be used uninitialized in this function
      

      这不是初始化 b 的有效位置,因此它在打印时包含未初始化的数据而不是 20。您正在导致未定义的行为。

      【讨论】:

        【解决方案4】:

        switch 语句根据switch 变量的值对相应的case 语句执行goto,仅此而已。现在你绕过了b 的初始化,所以它会打印出那个位置当时内存中的任何内容。

        【讨论】:

          【解决方案5】:

          这是一个 var scope 问题。如果你移动

          int b=20;
          

          在 switch 块之外,它会起作用。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-09-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-10-14
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多