Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
int f (…)
{
…
if (a)
…
if (b)
…
c = 15;
return 10;
}
Сколько времени уйдет на отладку первого варианта и сколько на отладку второго?Конечно, без goto отлаживать легче. Я в каждый момент времени знаю, в каком состоянии, в какой части цикла я нахожусь, и что меня не перекинет к чертовой матери, пока не перестанет действовать то или иное условие. В случае с таким обилием goto я такой логикой руководствоваться не могу.
А когда программа написана для микроконтроллера – это все уже становится существенно.Не надо все в кучу. Микроконтроллер и десктоп — очень разные вещи с точки зрения политики программирования.
if() goto P1;
else goto p2;
for(i=0;i<10;i++)
{
for(j=0;j<20;j++)
{
if(f(i, j))
break;
}
if(j<20)
break;
}
if ((strncmp(command, "add ", 4) == 0 && (comm = NREAD_ADD)) ||
(strncmp(command, "set ", 4) == 0 && (comm = NREAD_SET)) ||
(strncmp(command, "replace ", 8) == 0 && (comm = NREAD_REPLACE))) do
{
...
if(<error>)
{
...
break;
}
...
} while (false);
if(a==1)
{
A();
C();
}
while(b!=0 && c!=1)
{
if(b==0)
{
D();
}
B();
C();
}
E();
if(!func1(...))
{
if(!func2(...))
{
.....
}
else
{
code = 2
}
}
else
{
code = 1
}
if(func1(...))
{
code = 1;
goto exit;
}
if(func2(...))
{
code = 2;
goto exit
}
...
exit:
return code;
if( func1(...) )
{
code = 1;
}
else if( func2(...) )
{
code = 2;
}
...
return code;
if( !code && func1(...) )
{
code = 1;
}
if( !code && func2(...) )
{
code = 2;
}
...
return code;code = 0;
if (!func1(...)){
code =1;
}
if (!code){
if (!func2(...)){
code =2;
}
}
if (!code){
if (!func3(...)){
code =3;
}
}
...
return code;
если между операциями надо что-то делать, причем только если операция была успешной
do {
if( func1(...) ) {
code = 1;
break;
}
if( func2(...) ) {
code = 2;
break;
}
...
} while( 0 );char a, b, c;
for (a = 0; a < 10; ++a)
{
for (b = 0; b < a; ++b)
{
if (!c)
goto Leave;
}
for (b = 10; b < 15; ++b)
{
d ();
}
}
Leave:
e ();
void task()
{
char a, b, c;
for (a = 0; a < 10; ++a)
{
for (b = 0; b < a; ++b)
{
if (!c) return;
}
for (b = 10; b < 15; ++b)
{
d ();
}
}
}
...
task();
e ();
А теперь посмотрим на хитровывернутый алгоритм. Представление не имею что это за бред – но его надо реализовать.
AND X00 производит логическое И аккумулятора с дискретным входом 0 и помещает результат в аккумулятор. Немножко расширяет сознание, разбалованное питоном с его вкусностями :-)void f()
{
// выделение ресурсов
// goto ... goto ... goto ...
EXIT:
// освобождение ресурсов
}
void f()
{
// инициализация объектов выделенными ресурсами
// return ... return ... return ...
}
if a:
A()
C()
while b:
B()
C()
if not b:
if not c:
D()
B()
C()
else:
E()
break
if a
A
C
while b or not c
if not b
D
B
C
E
оставляет форматирование
if a
A
C
while b or not c
if not b
D
B
C
E
case 0:
{
int i;
}typedef /*указатель на функцию*/ FunctPtr;
FunctPtr sw[] = {A, B, C, D};
if (x < 4) sw[x - 1] ();
if(x<4){
switch(x){...}
большой код
}
Мы как-то с друзьями спорили насчёт goto.
Решили посмотреть на самые популярные, проверенные временем программы, которыми пользуются миллионы разработчиков: исходники ядра линукс, llvm, gtk, gstreamer, android и т.д.
В каждой из этих программ используется goto.
public int[,] ReadByCoil(out int npts) {
int[,] res=null;
npts=0;
if(m_curArea!=0) goto _1;
_2:
if(!StartNewSect()) return null;
_1:
res=ReadCoil();
if(res==null) goto _2;
npts=m_npt;
return res;
}
Запретный плод GOTO сладок!