Использует goto законный способ убежать из двух циклов?

Недавно у меня был случай, когда код, следующий за обратным вызовом, выполнялся до выполнения обратного вызова из $.ui.popup. Мое решение состояло в том, чтобы установить переменную перед рукой, называемой pause, установить ее в true, выполнить код $.ui.popup, а затем получить код, который мне нужно было ждать через некоторый интервал. Пример:

var pause = false;
function something() {
    if(edited && renamed) {
        pause = true;
        $.ui.popup({
            //...
            doneCallback: function() {
                //...
                pause = false;
            }
            //...
        });
        //...
    }

    var waitCode = setInterval(function(){
        if(!pause) {
            //... code I needed to wait on ...
            clearInterval(waitCode);
        }
    },500);
}
19
задан Zero Piraeus 22 January 2015 в 17:19
поделиться

5 ответов

return is a "structured" goto which many programmers find more acceptable! So:

static int findit(int sum, int* pa, int* pb, int* pc)
{
    for (int a = 1; a<sum; a++) {
        for (int b = 1; b < sum; b++) {
            int c = sum-a-b;
            if (a*a+b*b == c*c) {
                *pa = a; *pb = b; *pc = c;
                return a*b*c;
        }
    }
    return -1;    
}

int main() {
    int a, b, c;
    const int sum = 1000;
    int result = findit(sum, &a, &b, &c);
    if (result == -1) {
        std::cout << "No result!" << std::endl;
        return 1;
    }
    std::cout << "a:" << a << std::endl;
    std::cout << "b:" << b << std::endl;
    std::cout << "c:" << c << std::endl;
    std::cout <<"Result:" << result << std::endl;
    return 0;
}
46
ответ дан 30 November 2019 в 01:56
поделиться

См. этот вопрос о выходе из 2 контуров. Есть гораздо лучшие ответы, чем при использовании goto.

Лучший ответ - поместить второй цикл в функцию и вызвать эту функцию изнутри первого цикла.

код скопирован из ответа mquander

public bool CheckWhatever(int whateverIndex)
{
    for(int j = 0; j < height; j++)
    {
        if(whatever[whateverIndex][j]) return false;
    }

    return true;
}

public void DoubleLoop()
{
    for(int i = 0; i < width; i++)
    {
        if(!CheckWhatever(i)) break;
    }
}

Хотя мне кажется, что использование goto в этом случае не Это не так плохо, как убивать котят. Но это близко.

6
ответ дан 30 November 2019 в 01:56
поделиться

На мой взгляд, в такой ситуации нормально использовать goto .

Между прочим, снисходительные проповеди против goto обычно исходят от людей, которые просто повторяют то, что они слышали другие где-то говорят или читают ..

18
ответ дан 30 November 2019 в 01:56
поделиться

Вы можете объявить bool found = false вверху, а затем добавить &&! Found в свои условия цикла for (после a и b ), а затем установите значение true, где находится ваш текущий goto. Затем сделайте свой вывод условным, если найденное является истинным.

4
ответ дан 30 November 2019 в 01:56
поделиться

Я не могу придумать лучшей альтернативы. Но одна альтернатива, не использующая goto , будет модифицировать первый для -loop:

for (a = 1; a<sum && result == -1; a++){

Затем break из второго для - петля. Это будет работать при условии, что результат никогда не будет -1 после того, как второй для -цикла был прерван break .

4
ответ дан 30 November 2019 в 01:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: