- 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
*/
Soul_re@ver 06.06.2013 22:38 # 0
bormand 07.06.2013 05:23 # +3
Тут всего лишь присваивание пропустили, а инициализация была в строке 4.
Кстати, в крестах, в отличие от сишки, пропускать инициализацию нельзя (но присваивание можно), и если в ветке свича нужна переменная, приходится делать лишний { дурацкий блок }.
Ну и ссылка на тему: http://en.wikipedia.org/wiki/Duff%27s_device
anonimb84a2f6fd141 07.06.2013 03:14 # −8
inkanus-gray 07.06.2013 07:43 # 0
bormand 07.06.2013 08:33 # +3
anonimb84a2f6fd141 07.06.2013 08:40 # 0
Поправлюсь: это не баш, это BAT.
3Doomer 10.06.2013 11:50 # 0
Fxd.
inkanus-gray 07.06.2013 11:10 # +1
Выходит, что метки не являются частью структуры, а если их удалить, то синтаксис (вложенность скобок и всё такое) должен сохраняться?
bormand 07.06.2013 11:17 # +4
Именно так.
Весь switch это по сути один блок, на некоторые строки которого ссылаются метки, именно поэтому без бряка управление проваливается ниже, на следующие "ветви".
Видимо изначально это был какой-то костыль, который несложно было реализовать при помощи do { } while, адресов меток и какой-то матери.
bormand 07.06.2013 11:21 # +4
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.
Psionic 07.06.2013 11:57 # +1
bormand 07.06.2013 12:11 # +1
inkanus-gray 07.06.2013 12:22 # +1
Psionic 07.06.2013 12:23 # 0
inkanus-gray 07.06.2013 12:25 # +2
anonimb84a2f6fd141 07.06.2013 17:08 # −5
Vindicar 07.06.2013 10:39 # 0
guest 07.06.2013 17:15 # +3