goto в С?
for ()
{
for ()
{
for ()
{
if (что-нибудь) идти вниз
}
}
}
!сюда!
On 2002-04-02 1726, Anonymous wrote
Как сделать goto в С, желательно с промером
#include <stdio.h>
main()
{
lab
printf("Overflow ?");
goto lab;
}
// Заодно поймешь почему многие
// не используют goto.
[ Это Сообщение было отредактировано waste в 2002-04-02 2341 ]
exit=false;
while (expr1 && !exit) {
while (expr2 && !exit) {
while (expr3 && !exit) {
if (exprn) {exit=true;}
i1++;}
i2++;}
i3++;}
P.S. а про бряк (break) ты ничего не слышал ??
for (i=0;i<10;i++)
{
тело
}
реально представляет из себя
i=0;
while (i<10)
{
тело
i++;
}
т.ч. запись можно было не менять, а ввести в условие проверку флага.
И ещё. Приведи мне хоть одну разумную причину, по которой не рекомендуется использование goto в программах на C.
Сразу отметаем то, что типа это переход, который неоптимально обрабатывается процессором и т.п. бред. Если ты видел хоть один асмовый исходник своей сишной проги, то должен был обратить внимание на количество условных и безусловных переходов. Goto добавляет ОДИН БЕЗУСЛОВНЫЙ переход.
Давай, выдвигай аргументы своей стороны.
6.3.4 Goto [expr.goto]
C++ possesses the infamous goto
goto identifier;
identifier statement
The goto has few uses in general high-level programming, but it can be very useful when C++ code is generated by a program rather than written directly by a person; for example, goto can be used
in a parser generated from a grammar by a parser generator. The goto can also be important in the rare cases in which optimal efficiency is essential, for example, in the inner loop of some real-time application.
One of the few sensible uses of goto in ordinary code is to break out from a nested loop or switch-statement (a break breaks out of only the innermost enclosing loop or switch-statement). For example
void f()
{
int i;
int j;
for (i = 0; i<n; i++)
for (j = 0; j<m; j++) if (nm[j] == a) goto found;
// not found
// ...
found
// nm[j] == a
}
Ну что, mike, облажался? Бывает...
---
Самый верный способ ошибиться - посчитать себя умнее других.
Дело ведь не в оптимальность кода, а в акадимичности программирования. Меня из-за этих goto на осень оставили. Я чуть с универа не вылетел.
----------
Оператор GOTO - старейший и неструктурированный оператор языка BASIC. Программу с обилием GOTO трудно читать, отлаживать, модифицировать, так как она не имеет четкой структуры.
Использование в программе оператора GOTO свидетельствует о том, что программист не полностью овладел всем богатством управляющих структур языка QuickBASIC, или не знает их возможностей, а кроме того, не существует программных конструкций, где действительно было бы необходимо применение оператора GOTO.
Приведу примеры того, как можно избежать применения GOTO и других устаревших конструкций, которые достались QuickBASIC "по наследству" от GWBASIC.
------------
Оператора goto я не видел ни в одной серьезной программе.
----
Существует ОЧЕНЬ МАЛО примеров использования GOTO при программировании на высоком уровне, но это инструкция может быть крайне полезна, когда код C++ генерируется программой, а не человеком.
....
---
но в тоже время
---
....
Одним из немногих разумных способов использования GOTO в обычном коде является выход из вложенного цикла или switch-инструкции.
....
----
P.S. Если мы говорим об оптимальном коде, то не используем циклы n-ой вложенности
P.P.S. Что-то много анонимусов развелось, надо бы ввести обязательную регистрацию.
[ Это Сообщение было отредактировано mike в 2002-04-03 1128 ]
On 2002-04-02 2150, Anonymous wrote
Ну-ка расскажи мне, как ты осуществишь выход из цикла n-ной вложенности? Т.е.
for ()
{
for ()
{
for ()
{
if (что-нибудь) идти вниз
}
}
}
!сюда!
можно так попробовать
try {
for ()
{
for ()
{
for ()
{
if (что-нибудь) throw 1;
}
}
}
}
catch(...) {}
!здесь
c исключениями очень удобно работать, правда, это уже не С, а плюсы...
Про исключения. Рассматривался общий пример, который может содержать свои блоки исключений. Но для полноты картины, конечно, это тоже выход.
А насчёт анонимусов - ты бы прибил мёртвые записи, которые не посещаются уже больше полугода, а? Я бы тогда указал своё имя.
PLAstic
К тому же, если ты претендуешь на хорошее знание С++, то знал бы, что for есть макрос для while.
for (i=0;i<10;i++)
{
тело
}
реально представляет из себя
i=0;
while (i<10)
{
тело
i++;
}
Вы чего?!?! Я бы не советовал употреблять в данном случае слово МАКРОС в контексте C (может напишете #define который преобразует for к while?)
А как именно реализованы циклы это проблемы компиляторов.
И в чем именно облажался Майк?
ЛЮБУЮ программу на языках типа C/C++/Pascal можно реализовать без goto - это аксиома.
Вся проблема в эффективности - если в результате написания получается функция строк эдак на 500 с goto в каждой 10 строке и переходом +/- 400 строк то это ОЧЕНЬ ПЛОХАЯ программа и не зря в универах учат не использовать goto - учитесь правильно структурировать
P.P.S. Что-то много анонимусов развелось, надо бы ввести обязательную регистрацию.
и ещё не мешало бы BB код включить
Ну не он же вам будет делать следующую винду )))
for (int i=1; i<=5; i++)
{
for (int j=1; j<=5; j++)
{
ShowMessage("i="+String(i)+" j="+String(j));
if ((i==2) && (j==3)) goto Exit;
}
}
Exit:
Я не знаю будет ли это работать в С++ а в C++Builder прекрасно работает....
Набъет себе шишек потом умнее будет