В C возможно написать код перед первым case
маркировка. Есть ли какие-либо случаи, для которых полезно сделать это, или это - просто 'мертвый блок кода'?
Например:
switch (...) {
{
int a = 0x2a;
printf("%d\n", a);
}
case 0:
...
}
Может быть полезно объявить переменные, имеющие область, ограниченный блоком коммутатора
(но имейте в виду, что любые инициаторы для этих переменных будут пропущены):
switch (...)
{
int n;
case 0:
...
}
Теоретически, вы также можете поставить код там, что вы можете использовать GOTO
.
Существует меньшее известный раствор, который очень хорошо работает с чистым синтаксисом и гораздо более переносимостью, чем жесткие или относительные файлы 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
не может быть достигнут.
Итак, даже если это разрешено, это легко один из тех «только потому, что вы можете не значит, что вы должны» ситуации. Конструкция запутана и может легко привести к использованию неинициализированной переменной, поскольку его можно очень неясно, и где происходит инициализация.
Я не понимаю, что вы после. Почему бы просто не поставить код перед делом?
int a = 0x2a;
printf("%d\n", a);
switch (...) {
case 0:
...
}
Разве не то же самое, что вы намерены? (Помимо в вашем примере, в вашем примере код никогда не будет работать, если компилятор не жалуется.)
Я думаю, что это менее особенностью, чем артефакт того, как 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