switch语句问题

时间:2011-12-19 04:56:33

标签: c switch-statement

让我们通过代码看问题:

码-1

#include <stdio.h>

int main(int argc, char *argv[])
{
    int a =1;
    switch (a)
    {
        printf("This will never print\n");
    case 1: 
        printf(" 1");
        break;
    default:
        break;
    }   
    return 0;
}

此处printf()语句永远不会执行 - 请参阅http://codepad.org/PA1quYX3。但是

code-2

#include <stdio.h>
int main(int argc, char *argv[])
{
    int a = 1;
    switch (a)
    {
        int b;
    case 1:
        b = 34; 
        printf("%d", b);
        break;
    default:
        break;
    }   
    return 0;
}

此处int b将被声明 - 请参阅http://codepad.org/4E9Zuz1e

我不明白为什么code1 printf()没有执行但是在code2 int b中会执行。

为什么呢?

修改 我得到了那个b;是声明,它是在编译时分配内存,所以控制流是否到达那个声明将完成。

现在看到这段代码

#include<stdio.h>

int main()
{
   if(1)
   {
    int a; 
   }

a =1;
return 0;
}

这里int a在控制流路径中仍然没有编译...为什么?

2 个答案:

答案 0 :(得分:7)

switch视为仅带有标签的goto。你goto的位置并不重要,只要变量声明高于你使用它的位置,就可以使用它。这部分是由于变量声明是一个像表达式一样“完成”的可执行语句。那个开关非常接近于:

int a  = 1;

{
    if (a == 1) goto case1;
    goto defaultcase;

    int b;

case1:
    b = 34;
    printf("%d", b);
    goto end;

defaultcase:
    goto end;

end:
}

return 0;

gotob的范围无关。

尝试这样做:

switch (a)
{
int b = 1;
....

在这种情况下,即使声明了b,也会跳过初始化,因为可执行或不执行的可执行语句。如果您尝试这样做,编译器应该发出警告。

关于if内的声明(已更新的问题):在这种情况下,a的范围仅限于if。它在输入范围时创建,并在范围结束时销毁。

答案 1 :(得分:2)

因为int b;是一个声明,编译器不会为它生成代码。

int a = 1;

switch (a) {

/* Instructions corresponding to the code here will not be executed */
/* printf("hi"); Instructions for such code will never be executed */
/* int b;      It is just a declaration. No executable code is generated for it*/

int b = 34;/*Replaced int b by int b = 34 now b will never be initialized to 34*/
case 1:
   printf("%d",b);      /*you will get garbage value now*/
   break;
default:
   break;
}