Каким циклом вы больше любите пользоваться? - страница 5

 

Вложенные циклы в отдельную функцию, и можно даже без break обойтись.

 
Vitalii Ananev:

В вашем первом сообщении о количестве вложенных циклах не было не слова. Естественно в данном случае одного оператора break будет мало. Но можно и цикл организовать по другому. 

Спасибо за пример.

Но он показывает, как за исключение возможности перехода GOTO в языке приходится платить противоестественной труднопонимаемой заменой этого перехода на несколько операторов и даже функций. Кстати, текущее значение переменной цикла в func2 необходимо еще передавать в func1, иначе это циклы не вложенные, а независимые. Превратить один GOTO в 15 строк - извините, и слов-то не подберу. И все ради никак не определенного "считается плохим стилем"...

"Выскочить из вложенного цикла" -  по-моему, ясно, что циклов как минимум два. Об этом и говорит слово "вложенный".

 
Dmitry Fedoseev:

Вложенные циклы в отдельную функцию, и можно даже без break обойтись.

Так ведь return; тоже оператор безусловного перехода. Именно поэтому в самом конце функции его можно не проставлять.
 
Vladimir:

Спасибо за пример.

Но он показывает, как за исключение возможности перехода GOTO в языке приходится платить противоестественной труднопонимаемой заменой этого перехода на несколько операторов и даже функций. Кстати, текущее значение переменной цикла в func2 необходимо еще передавать в func1, иначе это циклы не вложенные, а независимые. Превратить один GOTO в 15 строк - извините, и слов-то не подберу. И все ради никак не определенного "считается плохим стилем"...

"Выскочить из вложенного цикла" -  по-моему, ясно, что циклов как минимум два. Об этом и говорит слово "вложенный".


Конечно кол-во строк кода увеличивается, тут не поспоришь. Но понятливость кода от этого хуже не стала. По крайней мере для меня. 

Vladimir:
Так ведь return; тоже оператор безусловного перехода. Именно поэтому в самом конце функции его можно не проставлять.

В конце функции надо запихнуть оператор return() иначе MT не хочет компилировать. Например такой код:

int func()
{
  if ()
  {
     return(0);
  {

}

будет ошибка, что не все части кода возвращают значение.

 
Vladimir:

Интересно, а как эти счастливчики обходятся без условных операторов, которые и означают переходы по метке (метка "ELSE", метка "{" и т.д.)?

Иногда, и часто, проще написать без меток, но иногда проще и надежнее с метками. Например, выскочить из вложенного цикла.

На мой взгляд, вложенный цикл лучше организовывать с помощью функций (и оператора break).

Не думаю, что вариант с оператором GOTO будет лучше (нагляднее, удобнее). По мне - удобнее - как раз отдельные функции.

 

В общем само понятие "Структурное программирование" принципы которого были изложены в 70-х годах Дейкстрой исключает применение оператора goto.

 
Vitalii Ananev:

Конечно кол-во строк кода увеличивается, тут не поспоришь. Но понятливость кода от этого хуже не стала. По крайней мере для меня. 


В конце функции надо запихнуть оператор return() иначе MT не хочет компилировать. Например такой код:

будет ошибка, что не все части кода возвращают значение.

Справочник MQL4 / Основы языка / Операторы / Оператор возврата return

В функциях с типом возвращаемого значения void необходимо использовать оператор return без выражения:

void SomeFunction()
  {
   Print("Hello!");
   return;    // этот оператор можно удалить
  }

Завершающая фигурная скобка функции предполагает неявное исполнение оператора return без выражения.

 
Vladimir:

Справочник MQL4 / Основы языка / Операторы / Оператор возврата return

В функциях с типом возвращаемого значения void необходимо использовать оператор return без выражения:

void SomeFunction()
  {
   Print("Hello!");
   return;    // этот оператор можно удалить
  }

Завершающая фигурная скобка функции предполагает неявное исполнение оператора return без выражения.


Я имел в виду функции которые возвращают какие либо значения, а void функция по сути процедура не возвращает ни каких значений по этому return, там не нужен. 

 
Vladimir:
Так ведь return; тоже оператор безусловного перехода. Именно поэтому в самом конце функции его можно не проставлять.

Не верьте никому.

Есть комбинаторные алгоритмы, где  с применением goto, программа становится более  компактнее, короче и ясно.

Правильно говорят что goto опасная штучка, но только для тупых программистов. 

 
Vitalii Ananev:

В общем само понятие "Структурное программирование" принципы которого были изложены в 70-х годах Дейкстрой исключает применение оператора goto.

Книжка Дейкстры "Дисциплина программирования" у меня лежит где-то с 1980, но вспомнить из нее что-либо, достойное упоминания, не смог. Сейчас книгу не нашел. Погуглил, нашел смешные вещи:

"Когда советское правительство приняло решение о переходе советской промышленности к копированию модельного ряда IBM/360, Дейкстра (работавший в то время в конкурировавшей с IBM фирме Burroughs) назвал это решение величайшей победой Запада в холодной войне, а выбранную для клонирования модель IBM/360 (прообраз советской ЕС ЭВМ) — величайшей диверсией Запада против СССР[8]."

"Дейкстра последовательно отстаивал необходимость математического подхода к программированию, который предполагает предварительное точное, всестороннее математическое описание задачи и способа её решения, формальное доказательство правильности выбранного алгоритма и последующую реализацию алгоритма в виде максимально простой, структурированной программы, корректность которой должна быть формально доказана."


Не вижу смысла искать у Дейкстры (противника, выходит, архитектуры IBM PC персональных компьютеров 1980-2017 г.г.) руководства к действию. Или кто-то на этом форуме стремится формально доказывать корректность своих программ? А перед этим формально доказывать правильность выбранного алгоритма? Какое, собственно, нам дело до того, что GOTO мешал Дейкстре создавать красивые теории по корректности алгоритмов и формальному доказательству корректности программ?

Очевидно, что он развивал теорию. А у теорий есть много таких свойств, которые противопоказаны практике. Как пример (вспомнил из Дисциплины программирования) - Дейкстре для изложения своих идей не подошел ни один язык программирования, ему пришлось в книге завести свой псевдоязык.

Причина обращения: