- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
#include <stdio.h>
int main() {
int i=5;
switch ( 2 ) {
case 0:
for ( i=0; i<10; i++ ) {
case 1:
printf("A i=%d\n",i);
case 2:
printf("B i*i=%d\n",i*i);
};
case 3:
printf("done");
break;
}
return 0;
}
/* OUTPUT
B i*i=25
A i=6
B i*i=36
A i=7
B i*i=49
A i=8
B i*i=64
A i=9
B i*i=81
done
*/
Тут всего лишь присваивание пропустили, а инициализация была в строке 4.
Кстати, в крестах, в отличие от сишки, пропускать инициализацию нельзя (но присваивание можно), и если в ветке свича нужна переменная, приходится делать лишний { дурацкий блок }.
Ну и ссылка на тему: http://en.wikipedia.org/wiki/Duff%27s_device
Поправлюсь: это не баш, это BAT.
Fxd.
Выходит, что метки не являются частью структуры, а если их удалить, то синтаксис (вложенность скобок и всё такое) должен сохраняться?
Именно так.
Весь switch это по сути один блок, на некоторые строки которого ссылаются метки, именно поэтому без бряка управление проваливается ниже, на следующие "ветви".
Видимо изначально это был какой-то костыль, который несложно было реализовать при помощи do { } while, адресов меток и какой-то матери.
In the very very very old version of C language (think of the time dinosaurs roamed the Earth), known as "Reference Manual" version of C (which refers to a document written by Dennis Ritchie), labels formally had type "array of int", meaning that you could declare an int * variable and assign the address of label to that variable Later you could use that variable as the operand of goto statement However, in ANSI C this feature was thrown out.