首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >switch语句中第一个“case”之前的代码

switch语句中第一个“case”之前的代码
EN

Stack Overflow用户
提问于 2010-01-20 20:49:38
回答 3查看 3.8K关注 0票数 17

在C语言中,可以在第一个case标签之前编写代码。有没有什么情况下这样做是有用的,或者它只是一个“死代码块”?

例如:

代码语言:javascript
复制
switch (...)    {
  {
    int a = 0x2a;
    printf("%d\n", a);
  }
  case 0:
    ...
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-01-20 21:11:04

声明作用域限于switch块的变量可能很有用(但请注意,这些变量的任何初始化器都将被跳过):

代码语言:javascript
复制
switch (...)
{
    int n;

    case 0:
    ...
}

从理论上讲,您还可以将使用goto的代码放在那里。

票数 14
EN

Stack Overflow用户

发布于 2010-01-20 20:54:37

我认为这与其说是一个特性,不如说是C如何对待switch/case-as的一个工件,它只是一系列没有语法限制的跳转目标。这就是Duff's device能够工作的原因,也是第一个case之前的代码永远不会运行的原因。

如果您查看生成的程序集,您将看到代码将被跳过:

代码语言:javascript
复制
    mov ecx, DWORD PTR _x$[ebp]
    mov DWORD PTR tv64[ebp], ecx
    cmp DWORD PTR tv64[ebp], 0                  ; here begins the switch
    je  SHORT $LN1@main                         ; jump to case 0
    jmp SHORT $LN4@main                         ; jump out of the switch
; Line 8
    mov DWORD PTR _a$752[ebp], 42
; Line 9
    mov edx, DWORD PTR _a$752[ebp]              ; here we have the dead code
    push    edx
    push    OFFSET $SG754
    call    _printf
    add esp, 8
$LN1@main:                                      ; and here case 0
; Line 12
    push    OFFSET $SG756
    call    _printf
    add esp, 4
$LN4@main:
; Line 15
    xor eax, eax
    mov esp, ebp
    pop ebp
    ret 0
票数 21
EN

Stack Overflow用户

发布于 2010-01-20 21:09:21

我不明白你想要什么。为什么不直接把代码放在案例之前呢?

代码语言:javascript
复制
int a = 0x2a;
printf("%d\n", a);
switch (...)    {
case 0:
...
}

这不是和你想要的一样吗?(除了在您的示例中,如果编译器没有错误,代码将永远不会运行。)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2101393

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档