Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

goto в С?

Аноним
Как сделать goto в С, желательно с промером
4
02 апреля 2002 года
mike
3.7K / / 01.10.2002
Нет ситуаций, когда goto нельзя избежать (Для меня самого, 5 лет назад это было загадкой)
Аноним
Ну-ка расскажи мне, как ты осуществишь выход из цикла n-ной вложенности? Т.е.

for ()
{
for ()
{
for ()
{
if (что-нибудь) идти вниз
}
}
}
!сюда!
500
03 апреля 2002 года
waste
26 / / 20.04.2000
Цитата:

On 2002-04-02 1726, Anonymous wrote
Как сделать goto в С, желательно с промером



#include <stdio.h>
main()
{
lab
printf(&quot;Overflow ?&quot;);
goto lab;
}


// Заодно поймешь почему многие
// не используют goto.


[ Это Сообщение было отредактировано waste в 2002-04-02 2341 ]

4
03 апреля 2002 года
mike
3.7K / / 01.10.2002
У, поколение бейсика

exit=false;
while (expr1 &amp;&amp; !exit) {
while (expr2 &amp;&amp; !exit) {
while (expr3 &amp;&amp; !exit) {
if (exprn) {exit=true;}
i1++;}
i2++;}
i3++;}

P.S. а про бряк (break) ты ничего не слышал ??
Аноним
Вот, милый мальчик! Это обязывает вводить доп.переменную. К тому же, если ты претендуешь на хорошее знание С++, то знал бы, что for есть макрос для while.

for (i=0;i<10;i++)
{
тело
}

реально представляет из себя

i=0;
while (i<10)
{
тело
i++;
}

т.ч. запись можно было не менять, а ввести в условие проверку флага.
И ещё. Приведи мне хоть одну разумную причину, по которой не рекомендуется использование goto в программах на C.
Сразу отметаем то, что типа это переход, который неоптимально обрабатывается процессором и т.п. бред. Если ты видел хоть один асмовый исходник своей сишной проги, то должен был обратить внимание на количество условных и безусловных переходов. Goto добавляет ОДИН БЕЗУСЛОВНЫЙ переход.
Давай, выдвигай аргументы своей стороны.
Аноним
Все внимательно наблюдаем за развитием - модератор облажался по-чёрному!
Аноним
А вот ещё для затравки мнение Бьерна Страуструпа(знаешь такого, mike?)

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, облажался? Бывает...

---
Самый верный способ ошибиться - посчитать себя умнее других.
4
03 апреля 2002 года
mike
3.7K / / 01.10.2002
Модератор не святой, сам много чего не знает.

Дело ведь не в оптимальность кода, а в акадимичности программирования. Меня из-за этих goto на осень оставили. Я чуть с универа не вылетел.

----------
Оператор GOTO - старейший и неструктурированный оператор языка BASIC. Программу с обилием GOTO трудно читать, отлаживать, модифицировать, так как она не имеет четкой структуры.
Использование в программе оператора GOTO свидетельствует о том, что программист не полностью овладел всем богатством управляющих структур языка QuickBASIC, или не знает их возможностей, а кроме того, не существует программных конструкций, где действительно было бы необходимо применение оператора GOTO.
Приведу примеры того, как можно избежать применения GOTO и других устаревших конструкций, которые достались QuickBASIC &quot;по наследству&quot; от GWBASIC.
------------

Оператора goto я не видел ни в одной серьезной программе.
4
03 апреля 2002 года
mike
3.7K / / 01.10.2002
Не надо меня учить Страуструпу. Вы сами то читали, то, что сюда запостили. Перевожу (не я, у меня книжка на русском)

----
Существует ОЧЕНЬ МАЛО примеров использования GOTO при программировании на высоком уровне, но это инструкция может быть крайне полезна, когда код C++ генерируется программой, а не человеком.
....
---

но в тоже время

---
....
Одним из немногих разумных способов использования GOTO в обычном коде является выход из вложенного цикла или switch-инструкции.
....
----

P.S. Если мы говорим об оптимальном коде, то не используем циклы n-ой вложенности

P.P.S. Что-то много анонимусов развелось, надо бы ввести обязательную регистрацию.


[ Это Сообщение было отредактировано mike в 2002-04-03 1128 ]
982
03 апреля 2002 года
AndreiKZ
3 / / 20.03.2000
Цитата:

On 2002-04-02 2150, Anonymous wrote
Ну-ка расскажи мне, как ты осуществишь выход из цикла n-ной вложенности? Т.е.

for ()
{
for ()
{
for ()
{
if (что-нибудь) идти вниз
}
}
}
!сюда!



можно так попробовать
try {
for ()
{
for ()
{
for ()
{
if (что-нибудь) throw 1;
}
}
}
}
catch(...) {}
!здесь

c исключениями очень удобно работать, правда, это уже не С, а плюсы...

Аноним
Суть сей дискуссии сводится к тому, что новичкам надо советовать только то, что объективно верно, а не личные убеждения. Гото запрещают использовать дедушки-фортранисты, которые преподают в ВУЗ'ах. И с другой целью - они учат ООП. Но многими это понимается неправильно.
Про исключения. Рассматривался общий пример, который может содержать свои блоки исключений. Но для полноты картины, конечно, это тоже выход.
А насчёт анонимусов - ты бы прибил мёртвые записи, которые не посещаются уже больше полугода, а? Я бы тогда указал своё имя.


PLAstic
475
03 апреля 2002 года
Winnie
90 / / 20.03.2000
Цитата:

К тому же, если ты претендуешь на хорошее знание С++, то знал бы, что 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 - учитесь правильно структурировать

526
04 апреля 2002 года
advisor
44 / / 20.03.2000
Цитата:

P.P.S. Что-то много анонимусов развелось, надо бы ввести обязательную регистрацию.


и ещё не мешало бы BB код включить

442
24 августа 2002 года
HexoGenus
121 / / 20.03.2000
Народ ну нужна ребенку игрушка дайте ему ее...
Ну не он же вам будет делать следующую винду )))
for (int i=1; i<=5; i++)
{
for (int j=1; j<=5; j++)
{
ShowMessage(&quot;i=&quot;+String(i)+&quot; j=&quot;+String(j));
if ((i==2) &amp;&amp; (j==3)) goto Exit;
}
}
Exit:
Я не знаю будет ли это работать в С++ а в C++Builder прекрасно работает....
Набъет себе шишек потом умнее будет
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог