На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела:
1. Название темы - краткое описание кто/что против кого/чего
2. В первом сообщении - список параметров, по которым идет сравнение.
3. Старайтесь аргументировать свои высказывания. Фразы типа "Венда/Слюникс - ацтой" считаются флудом.
4. Давайте жить дружно и не доводить обсуждение до маразма и личных оскорблений.
Модераторы: Модераторы, Комодераторы
Страницы: (32) « Первая ... 13 14 [15] 16 17 ...  31 32  ( Перейти к последнему сообщению )  
> goto vs break & continue , Кроха-сын пришел к отцу и спросила кроха: "goto - это хорошо?"
    а еще можно про указатели вспомнить :whistle:
      Цитата korvin @
      Цитата D_KEY @
      Мне кажется, что вариант с goto понятнее...

      O_O'

      Чем он понятней? Только тем, что там выход из трёх циклов?

      Там не выход, там вход :)

      Цитата
      Ну так достаточно весь этот код вынести из main в отдельную процедуру и использовать return.

      Покажи.

      Цитата
      В goto-версии циклы начинаются с нуля. Если вдруг при чтении файла что-то пойдёт не так и загрузятся неправильные значения счётчиков (ниже нуля), то получим баг.

      Это задача функции restore. Допустим, она по контракту гарантирует, что все счетчики будут корректными.

      Добавлено
      Цитата korvin @
      Чем он понятней?

      Тем, что там этот переход никак не сказывается на логике.
        Цитата D_KEY @
        Есть еще вариант со switch

        Прикольно :D Но от goto практически не отличается.
          Цитата OpenGL @
          Но от goto практически не отличается.

          Да абсолютно тоже самое. Только выглядит пугающе. Зато "без goto" :D

          Добавлено
          Цитата OpenGL @
          Цитата D_KEY @
          Есть еще вариант со switch

          Прикольно :D

          Я думаю, ты видел машину Даффа, стейтмашины на этом деле и бесстековые сопрограммы(например, в boost/asio/coroutine.hpp).
            Цитата D_KEY @
            Там не выход, там вход :)
            Это задача функции restore. Допустим, она по контракту гарантирует, что все счетчики будут корректными.

            Да, поспешил.

            ExpandedWrap disabled
              void foo()
              {
                  int i, j, k;
                  if !restore(&i, &j, &k) {
                      i = 0;
                      j = 0;
                      k = 0;
                  }
                  for(; i < 10; i++, j = 0)
                      for(; j < 10; j++, k = 0)
                          for(; k < 10; k++)
                              if !dowork(i, j, k) {
                                  save(i, j, k);
                                  return;
                              }
              }
              Неплохо. Уже почти дошло до goto по читабельности :) Только циклы не от нуля надо начинать.
              Сообщение отредактировано: OpenGL -
                Цитата OpenGL @
                Неплохо. Уже почти дошло до goto по читабельности :) Только циклы не от нуля надо начинать.

                Они и не от нуля начинаются. Обнуление нижестоящего счётчика происходит только после прохождения им этапа от некоего загруженного значения до максимального при изменении вышестоящего счётчика.
                Сообщение отредактировано: korvin -
                  Цитата korvin @
                  Обнуление нижестоящего счётчика происходит только после прохождения им этапа от некоего загруженного значения до максимального при изменении вышестоящего счётчика.

                  Я как раз о том, что там не обнуление нужно, а что-то такое:
                  ExpandedWrap disabled
                        for(; i < 10; i++, j = i)
                            for(; j < 10; j++, k = j)
                    Цитата OpenGL @
                    Я как раз о том, что там не обнуление нужно, а что-то такое:

                    Вообще-то как раз не нужно, нужно именно обнуление. Я понимаю, что тот код с goto понять не просто, но ты постарайся. =)

                    Там суть в том, что мы попадаем в произвольное место «трёхмерного» цикла. Т.е. тот код создаёт последовательность
                    [0,0,0],[0,0,1],[0,0,2]...[0,1,0],[0,1,1],[0,1,2]...[0,2,0],[0,2,1],[0,2,2]...
                    И мы попадаем в произвольное место, например в [2,3,4], цикл по k один раз проходит [4..9] и при всех следующих итерациях j начинается с нуля [0..9], как обычно, а не с загруженного значения 4. Так же и цикл по j, один раз проходит [3..9], а потом постоянно [0..9].
                      Почему обнуление? В том коде i <= j <= k. У тебя же это не выполняется.
                        Цитата OpenGL @
                        Почему обнуление? В том коде i <= j <= k. У тебя же это не выполняется.

                        Да нет же. Там происходит обнуление k при каждой итерации по j и обнуление j при каждой итерации по i. Просто с помощью goto мы попадаем в некое состояние [i,j,k] = [2,3,4] например. Выполняется тело цикла по k до 9, происходит итерация j и k обнуляется.
                          Цитата Qraizer @
                           
                          ExpandedWrap disabled
                            for(i=0; i<10; ++i)
                              for(j=i; j<10; ++j)
                               for(k=j; k<10; ++k)


                          Где тут обнуление?
                          Сообщение отредактировано: OpenGL -
                            Цитата OpenGL @
                            Цитата Qraizer @
                             
                            ExpandedWrap disabled
                              for(i=0; i<10; ++i)
                                for(j=i; j<10; ++j)
                                 for(k=j; k<10; ++k)


                            Где тут обнуление?

                            Что-то я сегодня вообще невнимателен (видимо из-за простуды). Показалось, что там циклы с нуля начинаются.
                              Цитата OpenGL @
                              Цитата korvin @
                              Обнуление нижестоящего счётчика происходит только после прохождения им этапа от некоего загруженного значения до максимального при изменении вышестоящего счётчика.

                              Я как раз о том, что там не обнуление нужно, а что-то такое:
                              ExpandedWrap disabled
                                    for(; i < 10; i++, j = i)
                                        for(; j < 10; j++, k = j)

                              Чем это отличается от моего второго варианта?
                              ExpandedWrap disabled
                                    int i = 0, j = 0, k = 0;
                                    restore(&i, &j, &k);
                                    
                                    for(; i < 10; ++i, j = i, k = j) {
                                      for (; j < 10; ++j, k = j) {
                                        for(; k < 10; ++k) {
                                    
                                          // ...
                                    
                                        }
                                      }
                                    }
                                Объясните, почему после 0,3,3 идёт 1,2,2?
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (32) « Первая ... 13 14 [15] 16 17 ...  31 32


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0587 ]   [ 15 queries used ]   [ Generated: 7.05.24, 08:36 GMT ]