C — Управление многими метками с помощью goto-инструкций

#c #label #goto

#c #метка #goto

Вопрос:

Хорошего дня,

Я должен разработать программу с как можно большим количеством goto -операторов и labels , насколько это возможно. Итак, мой вопрос в том, как можно было бы легко с этим справиться?

Я хотел бы реализовать по одному goto на if / else / while . Не знаю, как управлять этим надлежащим образом…

Давайте предположим, что в main () есть код в следующей форме:

 while (...)
{
  y = 4   3;
  y = ...;

  if (...)
  {
    x = x - 5;

    if (...)
    {
      // do something
    }
    else if (...)
    {
      if (...)
      {
        // do something
      }
    }
    else
    {
      i = 10   x;

      if (...)
      {
        // do something
      }
      else
      {
        // do something
      }
    }
  }
 ...
}
...
return 0;

  

В конце я хотел бы иметь код в виде следующей формы:

 while (...)
{
  ...
  goto PRIMARY_IF;
  ...
}

PRIMARY_IF:
  ...
  ...
END_PRIMARY_IF:

...
  

Каков наилучший способ преобразовать этот код в правильный с использованием labels и gotos для каждого if / else / while ?

Был бы признателен за любую помощь! Заранее спасибо!

Комментарии:

1. Я не знаю, зачем вам это делать в первую очередь. Ваш код на C компилируется (обычно) с помощью ассемблера, в котором нет циклов. Ваши while циклы и if операторы превращаются в условные переходы, так что попробуйте и сделайте это так?

2. В C обычной целью является использование наименьшего количества меток и goto инструкций, предпочтительно ни одной.

3. Что такое // do something , потому что, если он использует какие-либо локальные переменные, вы не сможете выйти за пределы области видимости цикла, поскольку вы не сможете использовать эти переменные. Если вам нужно как можно больше goto, сохраните для инициализации, вы можете изменить порядок всех строк в каждой области видимости и заставить вашу программу выполняться снизу вверх.

4. Спасибо за ответы. Я использую только глобальные переменные. @Quimby можете ли вы продемонстрировать свою идею на коротком примере? Я думаю, вы упомянули тот момент, который я не понимаю так далеко. Заранее спасибо!

5. @JohnM Конечно, pastebin.com/NfXKXiZ4 .