Код перед первым 'случаем' в операторе переключения

В C возможно написать код перед первым case маркировка. Есть ли какие-либо случаи, для которых полезно сделать это, или это - просто 'мертвый блок кода'?

Например:

switch (...)    {
  {
    int a = 0x2a;
    printf("%d\n", a);
  }
  case 0:
    ...
}
15
задан a3f 18 April 2015 в 16:41
поделиться

4 ответа

Может быть полезно объявить переменные, имеющие область, ограниченный блоком коммутатора (но имейте в виду, что любые инициаторы для этих переменных будут пропущены):

switch (...)
{
    int n;

    case 0:
    ...
}

Теоретически, вы также можете поставить код там, что вы можете использовать GOTO .

11
ответ дан 1 December 2019 в 00:49
поделиться

Существует меньшее известный раствор, который очень хорошо работает с чистым синтаксисом и гораздо более переносимостью, чем жесткие или относительные файлы URL.

<base href="<?=base_url();?>">

<img src="images/logo.gif" alt="Logo" />

Подробнее о том, как, что, почему на мою статье « обрабатывание активов в Codedigniter с базовым тегом ».

-121--3777382-

Стандартный документ C имеет пример, который точно объясняет поведение этого типа конструкции (6.8.4.2/7 «Оператор коммутатора»):

Пример в артиллерийском фрагменте программы

 Переключатель (EXPR)
 {
  int i = 4;
  f (i);
Случай 0:
  I = 17;
  / * падает в код по умолчанию * /
дефолт:
  printf ("% d \ n", i);
 }
 

Объект, идентификатор которого представляет собой I I , причем автоматический длительность хранения (в блоке), но никогда не инициализируется, и, следовательно, если управление выражением имеет ненулевое значение, вызов Printf Функция будет иметь доступ к неопределенному значению. Точно так же вызов функции f не может быть достигнут.

Итак, даже если это разрешено, это легко один из тех «только потому, что вы можете не значит, что вы должны» ситуации. Конструкция запутана и может легко привести к использованию неинициализированной переменной, поскольку его можно очень неясно, и где происходит инициализация.

12
ответ дан 1 December 2019 в 00:49
поделиться

Я не понимаю, что вы после. Почему бы просто не поставить код перед делом?

int a = 0x2a;
printf("%d\n", a);
switch (...)    {
case 0:
...
}

Разве не то же самое, что вы намерены? (Помимо в вашем примере, в вашем примере код никогда не будет работать, если компилятор не жалуется.)

1
ответ дан 1 December 2019 в 00:49
поделиться

Я думаю, что это менее особенностью, чем артефакт того, как CAME CLEAD CASE / / - просто серия целей прыжка без ограничений на синтаксис. Вот почему Устройство DUFF работает, и именно поэтому код до первого чехол никогда не будет работать.

Если вы посмотрите на сгенерированную сборку, вы увидите, что код будет просто переключаться:

    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
18
ответ дан 1 December 2019 в 00:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: