- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
int main()
{
int i = 0;
goto A;
for (;i<3; ++i)
L:{
{
int x;
x += i;
if (0) { A: x = 0; goto B; }
printf("X: %d ",x);
}
{
int y;
y -= i;
if (0) { B: y = 10; goto L; }
printf("Y: %d\n",y);
}
}
}
Fai 10.07.2012 17:26 # 0
wvxvw 10.07.2012 18:39 # +3
ну или как-то так.
Fai 11.07.2012 05:20 # +3
TarasB 10.07.2012 18:56 # +3
movaxbx 10.07.2012 19:55 # +4
TarasB 10.07.2012 20:07 # +2
А прыжок в точку, находящуюся после инициализации переменной, но в её зоне видимости, разве разрешается? Кресты вот запрещают.
bormand 10.07.2012 20:14 # +1
It is possible to transfer into a block, but not in a way that bypasses declarations with initialization. A pro-
gram that jumps77) from a point where a local variable with automatic storage duration is not in scope to a
point where it is in scope is ill-formed unless the variable has POD type (3.9) and is declared without an
initializer (8.5)
Получается, что впрыгнуть в блок можно даже в крестах, но только тогда, когда мы не пропускаем инициализацию переменных. Т.е. в данном случае все ок.
defecate-plusplus 10.07.2012 20:36 # −1
в с++03 пункт слово в слово
в с++11 дополнили:
It is possible to transfer into a block, but not in a way that bypasses declarations with initialization. A
program that jumps from a point where a variable with automatic storage duration is not in scope to a
point where it is in scope is ill-formed unless the variable has scalar type, class type with a trivial default
constructor and a trivial destructor, a cv-qualified version of one of these types, or an array of one of the
preceding types and is declared without an initializer
TarasB 10.07.2012 20:40 # +2
Это только в свиче парит, приходится лишние фигрные скобочки ставить, потому что логика свича идиотская, и она же перешла блин во все жабошарпы.
bormand 10.07.2012 20:46 # +2
switch, имхо, неудачная конструкция. Паскалевский case удобнее.
TarasB 10.07.2012 20:48 # +1
bormand 10.07.2012 20:52 # +1
> Метки веток сами работают как границы блока.
Именно. И у каждой ветки свой скоп, независимый от других.
TarasB 10.07.2012 21:13 # 0
А, ещё если в метках упомянуты не все значения перечислимого типа, то ветка default (называется others правда) обязательна.
bormand 10.07.2012 21:17 # 0
Ну на это, слава богу, и gcc ругаться умеет (опция -Wswitch, входит в -Wall). Спорно конечно, но имхо лучше ошибка/ворнинг, чем забытая ветка в свиче, когда я добавлю новое значение в enum.
TarasB 10.07.2012 21:22 # 0
Правда это не спасает, если есть заглушка
when others => null
(default : {} то бишь)
bormand 10.07.2012 21:39 # +1
Если я хочу обработать вот это, вот это и вот это, а для всех остальных значений, включая будущие ничего не делать - я вставлю заглушку в default.
Если же нужно обработать вот это, вот это и вот это, при остальных имеющихся значениях ничего не делать, а что делать с будущими - хбз, то я вместо заглушки с default напишу пустышки с каждым из оставшихся вариантов. И тогда компилятор предупредит меня, если я добавлю новое значение в енум, но забуду внести его в свитч...
> предупреждение одного компилятора
Ну мне кажется все вменяемые компиляторы с\с++ его умеют выдавать.
TarasB 11.07.2012 10:46 # 0
bormand 11.07.2012 11:13 # +6
А я же, между прочим, не зря писал про вменяемые компиляторы...
TarasB 10.07.2012 20:37 # 0
bormand 10.07.2012 20:42 # 0
Под инициализацией там понимается именно int x = 2; а не int x; x = 2; Во втором случае все ок.
P.S. Ну да, на русский я очень вольно перевел, сорри.
TarasB 10.07.2012 20:49 # 0
bormand 10.07.2012 20:15 # 0
Нет. Чтобы все охуели - нужен хаскель.
TarasB 10.07.2012 20:36 # +4
bormand 10.07.2012 20:40 # +1
zim 10.07.2012 20:54 # +4
bormand 10.07.2012 20:57 # 0
zim 10.07.2012 22:37 # 0
movaxbx 10.07.2012 23:12 # 0
Кто меньше?
zim 11.07.2012 12:11 # +4
vistefan 12.07.2012 22:00 # 0
bormand 13.07.2012 05:31 # +3
Fai 11.07.2012 05:22 # +6
bormand 11.07.2012 14:11 # +7
rat4 11.07.2012 15:21 # 0
Lure Of Chaos 13.07.2012 00:59 # 0
Lure Of Chaos 13.07.2012 00:59 # 0
другое дело jmp far - c ним учишься прыгать далеко.
Fai 13.07.2012 07:05 # +3
То ли дело j(x)!
ja, jna, jae, jnae, jb, jbe, jnb, jnbe, jo, jno, jz, je, jnz, jne, jc, jnc, jp, jnp, jg, jl, jge, jle, jng, jnge, jle, jnle.
И это я ещё половину забыл.
bormand 13.07.2012 10:24 # 0
defecate-plusplus 13.07.2012 10:28 # +3
guest 07.08.2012 08:39 # +2
>nae b
Чую, что-то тут нечисто)
sayidandrtfm 11.07.2012 14:58 # 0