switch语句问题

Jee*_*tel 2 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;
}
Run Code Online (Sandbox Code Playgroud)

这里的printf()语句永远不会执行 - 请参阅http://codepad.org/PA1quYX3.但

代码-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;
}
Run Code Online (Sandbox Code Playgroud)

int b将被宣布 - 请参阅http://codepad.org/4E9Zuz1e.

我没有得到为什么在code1 printf()中不执行但在code2中将int b执行.

为什么?

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

现在看看这段代码

#include<stdio.h>

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

a =1;
return 0;
}
Run Code Online (Sandbox Code Playgroud)

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

Set*_*gie 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;
Run Code Online (Sandbox Code Playgroud)

这与gotos的范围无关b.

尝试这样做:

switch (a)
{
int b = 1;
....
Run Code Online (Sandbox Code Playgroud)

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

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

  • @ Mr.32在这种情况下,`a`作为范围仅限于`if`.它在输入范围时创建,并在范围结束时销毁.请注意,`switch`es不会创建新的范围,就像标签和`goto`一样. (2认同)