Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
yury@debian-dev-vm:~/kernel/linux-2.6.36-starterkit/mm$ grep goto *.c | wc -l
894
yury@debian-dev-vm:~/kernel/linux-2.6.36-starterkit/mm$ cat *.c | wc -l
75724
#include <stdio.h>
int main()
{
int i, j;
for ( i = 0; i < 10; i++ )
{
printf_s( "Outer loop executing. i = %d\n", i );
for ( j = 0; j < 2; j++ )
{
printf_s( " Inner loop executing. j = %d\n", j );
if ( i == 3 )
goto stop;
}
}
// This message does not print:
printf_s( "Loop exited. i = %d\n", i );
stop:
printf_s( "Jumped to stop. i = %d\n", i );
}
* This source code was highlighted with Source Code Highlighter.if (...)
goto Cleanup;
if (...)
goto Cleanup;
...
Cleanup:
...
* This source code was highlighted with Source Code Highlighter.int f()
{
int res;
// some code ...
if (...)
{
res = rand();
goto finish;
}
// some code ...
finish:
return res;
}
* This source code was highlighted with Source Code Highlighter.
if (a) {
...
...
return 1;
}
if (b) {
...
...
return 2;
}
...
повторить 15 раз в том же духе
if (что-то) {
result = 1;
goto Exit;
}
if (что-то еще) {
result = 2;
goto Exit;
}
...
повторить много раз
...
: Exit
write_debug("Result: " + result);
return result;
if (что-то)
result = 1;
else if (что-то еще)
result = 2;
...
повторить много раз
...
write_debug("Result: " + result);
return result;
... ; вычисляем <что-то> и кладём в ebx test ebx, ebx jz L1 mov eax, 1 jmp Exit L1: ... ; вычисляем <что-то ещё> и кладём в ebx test ebx, ebx jz L2 mov eax, 2 jmp Exit L2: ... ; повторить много раз ... Exit: ... ; вызываем write_debug (result - в eax) ret
Или совсем избавиться от флага как это сделал eigrad здесь.
Теперь построим цикл while do с заменой предикатных и функциональных блоков.я правильно понимаю, что на этой схеме получилось нечто похожее на машину состояний — switch, в котором каждый case это подпрограмма, представляющая собой либо выбор нового значения L (одного из двух) либо выполнение операции и назначение нового L?:
L = 1
white L > 0:
switch L:
case 1: if p1 L = 2 else L = 3 ; break
case 2: f1; L = 6 ; break
...
case 8: f5; L = 0 ; break
Для каждого j>0 заменить все присваивания L=j соответствующей подпрограммой Gj(в том числе и для L=1). Так как L больше никогда не будет присвоено значение j можно убрать проверку L=j (вместе с соответствующей ей веткой выполнения) из структуры программы.выглядит как «inline» подпрограмм? эта затея осуществима для всех j>0, в любом случае? или тут схема маягче: «Для каждого j>0 пытаться заменить все присваивания L=j… », и «Если L больше никогда не будет присвоено значение j ...». Просто в данном примере заменились не все присавивания — «L=3» в структуре осталось.
О структурном программировании