прыжки внутри петли - PullRequest
       4

прыжки внутри петли

0 голосов
/ 27 мая 2010

C язык позволяет прыгать внутри цикла.Какая польза от этого?

  if(n > 3) {

    i = 2;
    goto inner;
  }

   /* a lot of code */

   for(i = 0; i < limit ;i ++) {

    inner:
    /* ... */
   }

Ответы [ 3 ]

2 голосов
/ 27 мая 2010

Если вы когда-либо программировали на Ассемблере (ASM), то вы знаете, что GOTO довольно стандартны и необходимы, на самом деле. Язык C был разработан так, чтобы быть очень близким к ASM, фактически не являясь ASM. Таким образом, я думаю, что «GOTO» был сохранен по этой причине.

Хотя, я признаю, что GOTO - это вообще "плохая идея, ммм?" с точки зрения управления потоком программ на C и любом другом языке более высокого уровня.

2 голосов
/ 27 мая 2010

Это, безусловно, сомнительная конструкция. Дизайн, который зависит от этого поведения, вероятно, плохой дизайн.

Вы пометили это как C ++, но C ++ (разумно, IMO) не позволяет вам перейти в цикл, где переменная была объявлена ​​в первой части оператора for:

int main()
{
    int q = 5;

    goto inner;

    for (int i = 0; i < 4; i++)
    {
        q *= 2;
inner:
        q++;
        std::cout << q << std::endl;
    }    
}

г ++ вывод:

l.cpp: In function ‘int main()’:
l.cpp:12: error: jump to label ‘inner’
l.cpp:7: error:   from here
l.cpp:9: error:   crosses initialization of ‘int i’

Инициализация i перед в цикле позволяет программе скомпилироваться нормально (как и следовало ожидать).

Как ни странно, компилирование с помощью gcc -std=c99 (и использование printf вместо этого) не не выдает ошибку, и на моем компьютере вывод:

6
13
27
55

как и следовало ожидать, если бы i были инициализированы вне цикла. Это может привести к убеждению, что int i = 0 может быть просто «извлечено» из инициализатора цикла во время компиляции, но i все еще находится вне области видимости, если попытаться использовать вне цикла.

0 голосов
/ 27 мая 2010

С http://en.wikipedia.org/wiki/Duff%27s_device

В информатике устройство Даффа представляет собой оптимизированную реализацию серийной копии, в которой используется метод, широко применяемый на языке ассемблера для разматывания цикла.

...

Причина, по которой это работает
Возможность легально перейти в середину цикла в C.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...