Метод множественного возвращаемого значения завершается с помощью операторов goto - PullRequest
0 голосов
/ 19 марта 2012

следующий код:

#include <cstdlib>
#include <iostream>
using namespace std;
int function(void)
{
    static int i,state=0;
    switch(state)
    {
         case 0: goto labeL0;
         case 1 :goto labeL1;         

    }

    labeL0:
    for (i = 0; i < 10; i++)
    {
        state=1;
        return i;
        labeL1:;
    }

}
int main(int argc, char *argv[])
{
    cout << function() << endl;
    system("PAUSE");
    return EXIT_SUCCESS;
}

выходит из строя. Я имею в виду, он возвращает только 0 вместо 0,1,2,...

Я хотел просто использовать метки и goto операторы для реализации таких функций. Это для практики (скажем, домашнее задание), но я не могу заставить его работать. Это вообще возможно?

Как использовать goto и операторы меток, чтобы эта функция печатала 0 1 2... и так далее?

Ответы [ 6 ]

4 голосов
/ 19 марта 2012

Мне не совсем понятно, что вы пытаетесь сделать. Если ваша цель Чтобы использовать goto, самое простое решение - реализовать алгоритм точно так же, как вы обычно делаете, заменяя циклические конструкции wit goto; т.е. вместо:

for ( int i = 0; i < 10; ++ i ) {
    std::cout << i << std::endl
}

Вы можете написать:

    int i = 0;
    goto label1:
label2:
        std::cout << i << std::endl;
        ++ i;
label1:
        if ( i < 10 ) goto label2;

В старые времена, с Фортраном IV, это то, что мы на самом деле делали. Сегодня нет абсолютно никакой причины делать это (кроме, может быть, запутывания).

Интересно, однако, учитывая статические переменные, если вы не пытаетесь реализовать какую-то подпрограмму; что каждый раз, когда вы вызываете функцию, вы выводите один выше, чем в предыдущий раз. В этом случае я бы рекомендую поддерживать состояние в классе, а не использовать статический переменные. Кроме того, функция будет нуждаться в некотором возвращаемом значении так что звонящий будет знать, когда он закончится, и звонящий надо зациклить. Что-то вроде следующего должно помочь:

class CoRoutine
{
    int i;
public:
    CoRoutine() : i( 0 ) {}
    bool function()
    {
        if ( i < 10 ) {
            std::cout << i <<std::endl;
            ++ i;
        }
        return i < 10;
    }
};

int
main()
{
    CoRoutine c;
    while ( c.function() ) {
    }
    return 0;
}

(Разумеется, goto по-прежнему не требуется.)

2 голосов
/ 19 марта 2012

Это не будет работать, так как после оператора return компилятор оставляет функцию, игнорирующую все операторы после нее.

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

1 голос
/ 19 марта 2012

После выполнения оператора return выполнение возвращается из функции () .....

Итак, изначально, когда i = 0, «return i» возвращает 0, и это отображается на экране

1 голос
/ 19 марта 2012

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

void function(void)
 {
     static int i=0;

     for(;i<10;)
     {         
         cout<<i;
         i++;
        function();
     }

}

void main()
{
 function();
}

но если вы все еще хотите использовать операторы goto, используйте это

void function(void)
{
   static int i =0;
   lablelA:
   cout<<i;
   i++;
   if(i  == 10)
       return;
   goto lablelA;

}
0 голосов
/ 19 марта 2012

Код напоминает мне Coroutines in C.

Чтобы напечатать 0, 1 и т. Д., Вы должны вызвать функцию несколько раз. Вот и весь смысл.

0 голосов
/ 19 марта 2012

Переход к labeL1 - переход по циклу с неинициализированной переменной i.Как это могло пойти правильно?Это только одна из причин, по которой стоит избегать перехода.

EDIT : на самом деле, он, вероятно, должен работать в качестве генератора бедного человека (из-за статических локальных переменных), но все жеслучай i> = 10 должен быть обработан.Теперь ничего не возвращается.Поэтому ваша основная проблема в коде заключается в том, что вам нужен цикл в main для вызова функции максимум 10 раз.

Тем не менее, это не та конструкция, которую я хотел бы видеть в реальном коде.

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