Форум программистов, компьютерный форум, киберфорум
Священные войны
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.93/75: Рейтинг темы: голосов - 75, средняя оценка - 4.93
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
06.08.2016, 12:55
Студворк — интернет-сервис помощи студентам
Коротко о том, чем же плох goto - ничем
Но если можно использовать более подходящие конструкции,
то тогда не нужно использовать goto, ибо зачем?
Каждому средству своё место
2
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.08.2016, 12:55
Ответы с готовыми решениями:

Чем плох управляемый С++?
Я дико извиняюсь за подобную тему... но дело в том, что мне сегодня задали этот вопрос и, собственно, я не смог на него ответить. Сам я...

Чем плох uCoz?
Добрый день! Хотел бы услышать объективные мнения специалистов, на тему "Почему юКоз нельзя использовать для создания полноценного...

Чем плох make?
Дали написать реферат по make файлам и соответственно указать его минусы, а значит сравнить его с такими утилитами как CMake, но для меня...

195
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
06.08.2016, 13:05
Цитата Сообщение от GbaLog- Посмотреть сообщение
Так вот, используете ли Вы goto и почему, а если не используете, то опять же, почему?
Если других альтернатив передать управление без паразитных флагов нет то использую. А иначе нет, ибо это ведет на Темную Сторону Силы.
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
06.08.2016, 13:27
Цитата Сообщение от hoggy Посмотреть сообщение
не над путать синтаксис языка,
и низкоуровневую кухню компиляторов.
А как еще сохранив общий скоп для case'ов можно
When the switch statement is executed, its condition is evaluated and compared with each case constant. If
one of the case constants is equal to the value of the condition, control is passed to the statement following
the matched case label
.
Если нету альтернативы jmp в данном случае, по почему нельзя называть вещи своими именами )))) Чего мы стыдимся?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
06.08.2016, 13:30
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
А как еще сохранив общий скоп для case'ов можно
ещё раз: не путайте синтаксис языка и кухню компилятора.
что он там у себя под капотом мутит - нас вообще не должно касаться.
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
06.08.2016, 13:31
hoggy, а как же "Закон дырявой абстракции" http://russian.joelonsoftware.... tions.html
0
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
06.08.2016, 13:56
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Если нету альтернативы jmp в данном случаи, по почему нельзя называть вещи своими именами )))) Чего мы стыдимся?
вот тут все объяснено
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
06.08.2016, 13:56
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
а как же "Закон дырявой абстракции"
фигня это все.
философский тромб мозга.
1
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
06.08.2016, 14:03
Цитата Сообщение от hoggy Посмотреть сообщение
философский тромб мозга.
Та не. тромб это когда че-то заткнули. А тут похоже философская дырка мозга (лоботомия).
Цитата Сообщение от hoggy Посмотреть сообщение
фигня это все.
А вот это поддерживаю.
0
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
06.08.2016, 14:09
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
а как же "Закон дырявой абстракции"
Понятно, что чем больше знаешь, тем лучше, и в каких-то ситуациях может помочь. Но я не вижу призыва дырявить абстракцию без необходимости.
1
 Аватар для CoderHuligan
1753 / 1019 / 257
Регистрация: 30.06.2015
Сообщений: 5,132
Записей в блоге: 56
06.08.2016, 14:09
Цитата Сообщение от GbaLog- Посмотреть сообщение
Так вот, используете ли Вы goto и почему
Использую. Почему? Потому что иначе немогу, вернее могу, но для этого потребовалось бы вывернуть свои мозги наизнанаку и потратить энное количество человеко-часов, которые очень дороги сами по себе. Ничто в мире так не ценится как время - time is money.
Цитата Сообщение от Voivoid Посмотреть сообщение
Она была интересная и актуальная лет так 50 назад.
Помоему за goto - будущее. Говорят, что "новое это хорошо забытое старое".
Цитата Сообщение от andreyananas Посмотреть сообщение
Наверное потому, что при использовании goto, программа становится (условно) нечитабельная.
Это в большинстве случаев верно. Только простые и тривиальные случаи использования goto наглядны. Но ведь и структурные программы без гото ещё труднее воспринимаются... Вопрос: а зачем тогда вообще читать программы, если можно использовать правильным образом оформленную документацию на программу? По этой документации и судить об алгоритмах и пр.? Ведь везде, в любой инженерной области используют проектную документацию, и без этого ничего никогда не делается. Невозможно построить небоскрёб с коленки без проекта. Невозможно построить боинг без документации, а ещё сложнее его отремонтировать если что-то не дай бог случится. Это невозможно по определению. Программы же принято писать без документации. В крайнем случае используют комментарии, но комментарии ничего не могут сказать об общей структуре программного объекта...
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
Оператор goto не вписывается в нормы структурного программирования, поскольку посредством него в программах происходит незакономерная передача управления из одного участка программы в другой (называется спагетти кодом)
Любая мало-мальски сложная программа не вписывается в рамки структурного подхода. Структурный подход это бесконечные вложенные условные и циклические конструкции, а это по определению - тот самый спагетти код. Только там одна макаронина вложена в другую и если кто-то захочет съесть этот толстый комок, то у него видимо должны возникнуть проблемы с его перевариванием. Честно говоря, когда я смотрю на код в котором вижу много вложенных ифов то меня это раздражает. Ну не должно так быть! Не должно! А - есть, так принято. Дейкстра сказал так("И Говорю Я тебе сын мой: никогда не используй goto! Я сказал , Дейкстра Твой."). А грабельки-то те же..
Цитата Сообщение от hoggy Посмотреть сообщение
что злоупотребления могут привести к осложнениям жизни,
Проблемы возникают там, где структурный подход пытаются эмулировать с помощью безусловного опертора goto. Вот тут и возникают большие проблемы, ибо сам по себе структурный подход плох(я выше писал почему), а тут ещё goto добавили и получили то, что получили.
1
 Аватар для Voivoid
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
06.08.2016, 14:20
Цитата Сообщение от CoderHuligan Посмотреть сообщение
Помоему за goto - будущее. Говорят, что "новое это хорошо забытое старое".
Как говорится "talk is cheap. show me the code"
1
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
06.08.2016, 14:23
Цитата Сообщение от CoderHuligan Посмотреть сообщение
ибо сам по себе структурный подход плох(я выше писал почему)
Все плохо если его неправильно использовать. При подходе "текст функции должен помещаться в один экран" структурный подход все что надо для нормальной читабельности. Ну а при правильной декомпозиции редкий метод долетит до середины Днепра дотянет по размеру до половины экрана
0
 Аватар для CoderHuligan
1753 / 1019 / 257
Регистрация: 30.06.2015
Сообщений: 5,132
Записей в блоге: 56
06.08.2016, 14:48
Цитата Сообщение от Voivoid Посмотреть сообщение
Как говорится "talk is cheap. show me the code"
Дело даже не в самом по себе goto. Это просто оператор, один из многих. Можно назвать его и по другом если кому-то не нравится(красная тряпка), например go или даже просто # как это сделано в языке предикатного программирования P, профессора Шелехова. Суть от этого не изменится: этот опретор обеспечивает переход между осмысленными блоками кода. Осмысленны они из-за того, что здесь есть метка, которая имеет имя. В GCC, как известно ввели фичу: можно брать даже её адрес и присваивать его указателю, таким образом получается указатель на метку. Очень перспективная штука, которую ещё мало кто оценил. Ну, да ладно..
Заметьте: между блоками кода. А что такое блок кода? Это функционально законченная конструкция обеспечивающая с помощью условных операторов переход к другим функционально законченым блокам..
По всей видимости единственное место, где данный оператор был бы прямо на своём месте, - в реализации автомата(машины Тьюринга) применительно к любым возможным программным системам. Машина Тьюринга против структурного подхода априори, поэтому именно здесь данный оператор на своём месте. Под автомат подведена мощная математическая база(чего не скажешь о структуре), поэтому программы стновится очень легко верифицировать.
0
829 / 253 / 34
Регистрация: 27.07.2016
Сообщений: 497
Записей в блоге: 1
06.08.2016, 15:26
Ferrari F1, goto != jmp, почему?
Потому что реализация goto может быть несколько сложнее чем простой jmp.
Почему? Потому что goto должен учитывать некоторые особенности языка и выполнять дополнительную работу.
Для примера:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
 
 
struct Test
{
    Test(){std::cout << "Test::ctor" << std::endl;}
    ~Test(){std::cout << "Test::dtor" << std::endl;}
};
 
 
 
int main(int argc, char *argv[])
{
  
  std::cout << "start" << std::endl;
 
    {
        Test t;
        //asm("jmp asm_lbl");
        goto goto_lbl;
    }
  
    
  asm("asm_lbl:");    
  goto_lbl:
  std::cout << "finish" << std::endl;
}
С goto: http://rextester.com/BLIR73541
start
Test::ctor
Test::dtor
finish
с простым jmp'ом: http://rextester.com/CVEQ25565
start
Test::ctor
finish
1
1378 / 522 / 72
Регистрация: 21.07.2015
Сообщений: 1,308
06.08.2016, 16:07
goto ничем не плох, если использован по назначению. В Си без него в некоторых случаях пришлось бы городить очень много лишнего кода. Си++ вполне можно обходиться и без него.
0
829 / 253 / 34
Регистрация: 27.07.2016
Сообщений: 497
Записей в блоге: 1
06.08.2016, 16:15
Изыскания на тему.
Провел некоторое "исследование" как компилятор работает с goto.
За основу взял код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
 
 
struct Test
{
    Test(){std::cout << "Test::ctor" << std::endl;}
    ~Test(){std::cout << "Test::dtor" << std::endl;}
};
 
 
 
int main(int argc, char *argv[])
{
  
  std::cout << "start" << std::endl;
 int x;
 std::cin >> x;
 {
   Test t;
   if(x==0){
     //asm("jmp asm_lbl");
     goto goto_lbl;
   }else{
     Test t2;
   }
   std::cout << "end t lifetime" << std::endl;
 }
  std::cout << "finish" << std::endl;
  return 0;
  asm("asm_lbl:");    
  goto_lbl:
  std::cout << "after return" << std::endl;
}
Компилятор: gcc 5.3,
ключи: -std=c++14 -O0
Из выхлопа на asm'е оставил самое интересное:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
*Вывод start*
*Ввод x*
        lea     rax, [rbp-21]
        mov     rdi, rax
        call    Test::Test()
        mov     eax, DWORD PTR [rbp-20]
        test    eax, eax
        jne     .L4 <- если не 0, то идем к L4
        mov     ebx, 0 <- в ebx записали 0, потом узнаем зачем :)
        jmp     .L5 <- идем к L5, для goto метка L13, но мы идем не к ней, а к концу скоупа
.L4:
*Создание и удаление объекта t2*
*Вывод end t lifetime*
        mov     ebx, 1 <- а здесь в ebx записали 1, также потом узнаем зачем.
.L5:
        lea     rax, [rbp-21]
        mov     rdi, rax
        call    Test::~Test()
        cmp     ebx, 1 <- а вот и пригодилось значение в ebx. Если мы прошли сюда по goto, то в ebx будет 0,
        jne     .L13 <- так что пойдем к L13 (метка для goto), если же мы бы попали сюда не через goto, то идем дальше
*Вывод after scope*
*Вывод finish*
        mov     eax, 0
        jmp     .L14 <- прыжок к выходу
.L13:
*Вывод after return*
        mov     eax, 0
        jmp     .L14 <- прыжок к выходу
...
0
Падаван С++
 Аватар для obivan
447 / 261 / 89
Регистрация: 11.11.2014
Сообщений: 916
06.08.2016, 18:42
Ну лично я считаю, что все таки не очень гуд его юзать, хотя бы потому что мне кажется в больших проэктах если делать длинные "прыжки" то можно что то упустить, допустим то же освобождение памяти это первое ну и естественно если пропускается кусок кода нужный, допустим создание какого то объекта который должен был бы использоватся потом, и это хорошо если программист который пишет это помнит все, а если дать другому человеку и он в тонне кода не заметит метку и готушку и напишет там что то свое а оно не пашет, ну тогда могут возникнуть проблемы, единственное честно всегда задавался вопросом как из сильно вложеных циклов выходить, потому что помимо брейка приходилось делать флаги что сработал брейк и тд. так что лично я вижу полезность только там, ну или вот еще в голову пришла идея, допустим у нас есть игра и меню и при выходе в меню из игры мы могли бы прыгать назад, ну такое тоже, черевато проблемами но все же, ну это скажем так мнение новичка да и честно говоря многие выступили в защиту goto, но лично у hoggy, в коде никогда такого не видел
2
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
06.08.2016, 19:24
Цитата Сообщение от obivan Посмотреть сообщение
но лично у hoggy, в коде никогда такого не видел
Цитата Сообщение от hoggy Посмотреть сообщение
C++
1
goto view;
большой бабах
1
 Аватар для CoderHuligan
1753 / 1019 / 257
Регистрация: 30.06.2015
Сообщений: 5,132
Записей в блоге: 56
06.08.2016, 19:57
Цитата Сообщение от Voivoid Посмотреть сообщение
show me the code
Например поиск минимального в массиве, автоматная реализация без переменной состояния:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <stdio.h>
#define n 8
int main(void) 
 {   
   int a[n] = { 18, 44, 2, 42, 100, 18, 6, 76 } ; 
   int max,i; 
   max = a[0]; 
   i = 1;
 state0: 
      if( i >= n )
                   goto end;
         else 
                   goto state1;           
 state1: 
      if( a[i] < max )
               goto state2; 
         else 
                   goto state3;                     
 state2: 
      max = a[i] ;
                   goto state3;
 state3: 
      i++ ;
                   goto state0;
 end:
printf("%d\n", max); 
    return 0;
}
казалось бы: ну зачем весь этот сыр-бор? Ведь можно написать обычно, без Тьюринга. Можно. А теперь представим, что нам нужно не просто найти минимальное в массиве, а искать минимальное исключая определённые числа, например 2 и 6. Хорошо. Достаточно добавить в состояние state1 необходимую проверку:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <stdio.h>
#define n 8
int main(void) 
 {   
   int a[n] = { 18, 44, 2, 42, 100, 18, 6, 76 } ; 
   int max,i; 
   max = a[0]; 
   i = 1;
 state0: 
      if( i >= n )
                   goto end;
         else 
                   goto state1;           
 state1:
      if(a[i] == 2 || a[i] == 6)
                   goto state3; 
      if( a[i] < max )
               goto state2; 
         else 
                   goto state3;                     
 state2: 
      max = a[i] ;
                   goto state3;
 state3: 
      i++ ;
                   goto state0;
 end:
printf("%d\n", max); 
    return 0;
}
как видно здесь все состояния хорошо видны и на кждое из них можно навесить свои проверки и переходы в другие состояния автомата. Все переходыпо состояниям собраны в одном месте, а не раскиданы по коду.
Если ввести переменную, которая обозначала бы состояния в каждый момент времени работы автомата, то мы получили бы автомат с памятью предыдущего состояния. Автоматная программа позволяет обойтись без вложенных циклов и вложенных ifов, а также без флагов, которые заменяет всего одна переменная состояний.
0
1943 / 1768 / 825
Регистрация: 23.01.2014
Сообщений: 6,230
06.08.2016, 20:55
Цитата Сообщение от CoderHuligan Посмотреть сообщение
как видно здесь все состояния хорошо видны и на кждое из них можно навесить свои проверки и переходы в другие состояния автомата.
Это на сколько же должен быть извращен мозг, чтобы 2 предыдущих варианта казались более наглядными, удобными и гибкими чем эти:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
#define n 8
int main(void)
{
    int a[n] = { 18, 44, 2, 42, 100, 18, 6, 76 } ;
    int max = a[0];
    for (int i = 1; i < n; ++i)
    {
        if (a[i] < max)
            max = a[i];
    }
 
    printf("%d\n", max);
    return 0;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
#define n 8
int main(void)
{
    int a[n] = { 18, 44, 2, 42, 100, 18, 6, 76 } ;
    int max = a[0];
    for (int i = 1; i < n; ++i)
    {
        if(a[i] == 2 || a[i] == 6)
            continue;
        if (a[i] < max)
            max = a[i];
    }
 
    printf("%d\n", max);
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.08.2016, 20:55
Помогаю со студенческими работами здесь

чем плох mysql_query
Просматривал вакансию на пхп juniora наткнулся на такое требование &quot;В коде нет и намека на mysql_query(&quot;SELECT * ....&quot; я...

Чем плох void main?
Встретил мнение, что void main() - не канон и даже плохо. Но статья древняя, 1996 года, и даже автор открестился, сказав, что для новых...

Чем плох std::map?
std::map ?

Чем плох ProBuilder (Unity3D)?
Мне советовали не использовать ProBuilder, а моделить в какой-нибудь проге - текстурить и потом эспортировать в юнити. Аргументировали это...

В чем плох этот код?
Всем привет, давно меня тут не было, но сразу к делу... Есть вот такой проект, выполненный как тестовое задание на стажировку, в которой...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
[golang] Двоичная куча, min-heap
alhaos 20.05.2026
Двоичная куча Двоичная куча — структура данных, которая всегда держит самый важный элемент наготове. Представьте очередь к хилеру в игре, и очередь из игроков в приоритете те у кого меньше. . .
[golang] Breadth-First Search
alhaos 19.05.2026
BFS (Breadth-First Search) — это базовый алгоритм обхода графа в ширину, который поуровнево исследует все связанные вершины. Он начинает с выбранной точки и проверяет всех соседей, прежде чем. . .
[golang] Алгоритм «Хак Госпера»
alhaos 17.05.2026
Алгоритм «Хак Госпера» Хак Госпера (Gosper's Hack) — алгоритм нахождения следующего по величине числа с тем же количеством установленных бит. Придуман Биллом Госпером в 1970-х, опубликован в. . .
Рисование бинарного древа до 6-го колена на js, svg.
russiannick 17.05.2026
<svg width="335" height="240" viewBox="0 0 335 240" fill="#e5e1bb"> <style> <!]> </ style> <g id="bush"> </ g> </ svg> function fn(){ let rost;/ / высота древа let xx=165,yy=210,w=256;
FSharp: interface of module
DevAlt 16.05.2026
Интерфейс модуля F# позволяет управлять доступностью членов, содержащихся в реализации модуля. По-умолчанию все члены модуля доступны: module Foo let x = 10 let boo () = printfn "boo" . . .
Хитросплетение родственных связей пантеона греческих богов.
russiannick 14.05.2026
Однооконник, позволяющий узреть и изучить отдельных героев древней Греции. <!DOCTYPE html> <html lang="ru"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible". . .
[golang] Угол между стрелками часов
alhaos 12.05.2026
По заданным значениям часа и минуты необходимо определить значение меньшего угла между стрелками аналогового циферблата часов. import "math" func angleClock(hour int, minutes int) float64 { . . .
Debian 13: Установка Lazarus QT5
ВитГо 09.05.2026
Эта инструкция моя компиляция инструкций volvo https:/ / www. cyberforum. ru/ blogs/ 203668/ 10753. html и его же старой инструкции по установке Lazarus с gtk2. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru