- 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
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
#include <stdio.h>
int main()
{
int a = 5, b = 6;
void* go;
go = ( a > b )? &&true1: &&false1;
goto *go;
true1:
{
printf("%i > %i\n", a, b);
goto next1;
}
false1:
{
printf("%i <= %i\n", a, b);
}
next1:
a = 7;
go = ( a > b )? &&true2: &&false2;
goto *go;
true2:
{
printf("%i > %i\n", a, b);
goto next2;
}
false2:
{
printf("%i <= %i\n", a, b);
}
next2:
return 0;
}
В GCC есть такой экстеншен http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html
Можно в goto передавать переменную и можно работать с адресами меток. В сочетании с тернарной условной операцией, этим можно заменить if
tirinox 30.07.2013 12:10 # +2
bormand 30.07.2013 12:13 # +5
Эта фича существовала давным-давно, еще до ANSI C, когда по земле ходили мамонты... Потом ее слава богу выпилили... Как оказалось - не до конца.
P.S. Тут же можно еще и с адресной арифметикой постебаться - goto go+5;
bormand 30.07.2013 12:47 # +2
j123123 30.07.2013 13:20 # 0
inkanus-gray 01.08.2013 06:32 # 0
inkanus-gray 01.08.2013 09:41 # 0
bormand 01.08.2013 12:10 # +2
Это на случай, если на одном из входов затесалась двойка? :)
inkanus-gray 31.07.2013 21:11 # +1
http://gravatar.com/avatar/f3dd16071dd47ba61cd705ed6d200069?size=512
bormand 01.08.2013 05:40 # 0
inkanus-gray 01.08.2013 06:03 # +1
http://rudocs.exdat.com/pars_docs/tw_refs/33/32904/32904_html_7235efb3.gif
Всё у этих мерикосов через жопу. По мне легче запомнить, что & — это И, чем учить эти выпуклости и вогнутости.
1024-- 30.07.2013 14:32 # +8
И реализовать его как-то так:
(А вообще, как обычно создатели интерпретаторов в этом случае поступают? Шитый код, switch или ещё что?)
guest 30.07.2013 15:02 # −7
bormand 30.07.2013 15:29 # +10
anonimb84a2f6fd141 31.07.2013 03:30 # −2
1024-- 31.07.2013 03:45 # −2
bormand 31.07.2013 05:27 # 0
inkanus-gray 31.07.2013 06:34 # −1
anonimb84a2f6fd141 31.07.2013 12:51 # −2
inkanus-gray 31.07.2013 17:10 # +1
В бате переход возможен только на фиксированную метку.
anonimb84a2f6fd141 31.07.2013 20:08 # −1
inkanus-gray 31.07.2013 21:04 # 0
Я писал о том, что GOTO %Variable% в батнике работать не будет. Только GOTO 1, только хардкор.
anonimb84a2f6fd141 01.08.2013 07:37 # −1
inkanus-gray 01.08.2013 09:26 # 0
Ccik 05.08.2013 14:18 # +3
anonimb84a2f6fd141 05.08.2013 16:40 # 0
Ccik 05.08.2013 21:37 # 0
inkanus-gray 05.08.2013 16:55 # 0
Осталось придумать, чем заменить массивы.
1024-- 06.08.2013 19:38 # 0
anonimb84a2f6fd141 07.08.2013 13:12 # +2
wvxvw 07.08.2013 10:03 # 0
Случайно наткнулся, теперь вот, хотя бы знаю, как называется.
ctm 06.08.2013 06:48 # 0
bormand 06.08.2013 07:51 # 0
1024-- 06.08.2013 19:46 # 0
Мне вот интересно, создатели интерпретаторов в этом случае сразу переходят на генерацию кода, пишут на ассемблере, или вызов функции не такой медленный по сравнению с тем, что в этой функции будет.
Xom94ok 30.07.2013 18:28 # +5
Lure Of Chaos 01.08.2013 06:27 # +4
dwarf_with_beer 31.07.2013 07:35 # +3
{
static void * lbs[] = {&&POS,&&NEG};
goto *lbs[((unsigned int)value) >> 31];
NEG:
return (~value)+1;
POS:
return value;
}
говновычисление говномодуля
bormand 31.07.2013 08:11 # 0
dwarf_with_beer 31.07.2013 08:22 # −1
bormand 31.07.2013 08:33 # +1
dwarf_with_beer 31.07.2013 08:40 # −1
bormand 31.07.2013 08:39 # 0
Нужен. Иначе будет неопределенное стандартом поведение. Обычно - знаковое расширение, из-за которого будет вынут -1й элемент массива вместо первого ;)
P.S. А, понял. unsigned int не нужен если value изначально беззнаковое ;)
dwarf_with_beer 31.07.2013 08:58 # −1
bormand 31.07.2013 09:01 # +1
В младшем то единицу, да. Но в остальных то тоже вылезет единица (т.к. число отрицательное и знаковый бит равен единице). А 0xFFFFFFFF это -1.
> УБ получается при сдвиге на >31 бит
А это другой уб уже. Здесь я имел в виду уб (или implementation defined, не помню уже), связанный со сдвигом отрицательного числа вправо.
dwarf_with_beer 31.07.2013 09:10 # 0
bormand 31.07.2013 08:52 # +1
Выдалось при сборке вот этого кода с оптимизацией: P.S. На -O0 это даже работает...
https://ideone.com/9FH225
dwarf_with_beer 31.07.2013 09:11 # 0
bormand 31.07.2013 09:46 # +4
dwarf_with_beer 31.07.2013 10:14 # +2
bormand 31.07.2013 12:04 # 0
inkanus-gray 31.07.2013 17:19 # 0
dwarf_with_beer 01.08.2013 05:00 # +3
inkanus-gray 01.08.2013 06:54 # 0
bormand 01.08.2013 09:29 # +1
А еще тут вместо магической тройки возникла магическая шестерка ;)
inkanus-gray 01.08.2013 09:36 # 0
Я старался! А ведь мог тупо написать разность между метками, тогда бы и магическая константа не понадобилась.
dwarf_with_beer 01.08.2013 10:26 # +3
dwarf_with_beer 01.08.2013 12:53 # +1
roman-kashitsyn 01.08.2013 13:22 # +3
3.14159265 01.08.2013 14:02 # 0
Одна из самых любимых, наряду с Конкретной математикой Кнута.