Можно ли использовать цикл for() для организации ветвления?
PS язык С
Да, можно. Пусть T - условие, тогда конструкция for( ; T ; ) { A; T = false; } эквивалентна конструкции if( T) { A; } , причём T не меняется в А.
Код:
if условие then a else b;
можно написать так:
Код:
type
TProc = procedure;
var
p:array[boolean] of TProc;
procedure a;
begin
...
end;
procedure b;
begin
...
end;
begin
p[false]:=@a;
p[true]:=@b;
.....
p[условие];
end.
TProc = procedure;
var
p:array[boolean] of TProc;
procedure a;
begin
...
end;
procedure b;
begin
...
end;
begin
p[false]:=@a;
p[true]:=@b;
.....
p[условие];
end.
Код:
void (*p)()[2]
конструкция IF все равно выдаст самый эффективный код.
Кстати указатели на функции иногда предпочтительней. Например, если условное выражение не меняется во время выполнения программы.
Пример такого выражения - наличие поддержки процессором инструкций MMX.
использовать можно. Как в принципе и приведенные выше коды. Только не забывайте одну простую весщ. Можно прыгать с крыши дома - но не всем это делать рекомендуется. Писать такую фигню в реальных проектах - лучше не надо.
Цитата: kot_
использовать можно. Как в принципе и приведенные выше коды. Только не забывайте одну простую весщ. Можно прыгать с крыши дома - но не всем это делать рекомендуется. Писать такую фигню в реальных проектах - лучше не надо.
Я несколько раз использовал такую фигню в реальных проектах. То, что в моем посте, называется - таблица функций. Очень удобно, когда вариантов не два, как описано, а много.
Цитата: kot_
использовать можно. Как в принципе и приведенные выше коды. Только не забывайте одну простую весщ. Можно прыгать с крыши дома - но не всем это делать рекомендуется. Писать такую фигню в реальных проектах - лучше не надо.
Почему не надо? Можешь сказать?
У меня прога к примеру работает с флешом. От флеша команды я получаю как LPSTR. Я бы мог в if'e сверять эту строку со всеми возможными. Но ведь намного проще и читабельнее код с использованием таблицы функций, которые надо запустить.
он имел ввиду for для ветвления по всей видимости,а не указатели на функции )
Цитата: aks
он имел ввиду for для ветвления по всей видимости,а не указатели на функции )
Да имелось ввиду сабж темы.
Кто-то может привести пример использования for для ветвления, более чем
Код:
for(int x=0; x<n; x++)
if(A[x])
b(); // или еще как-то
if(A[x])
b(); // или еще как-то