Вопрос о goto в C

Я пытаюсь понять код C. В какой-то части есть:

for ...{
    if condition{
       a=1;
       break;
    }
}

который в более поздней версии изменен на:

for ...{
    if condition{
       goto done;
    }
}
done: a=1;

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

ИСПРАВЛЕНИЕ: Исправление:

for ...{
    if condition{
       goto done;
    }
}

            goto notdone;
            done: 
                ok=0;
            notdone:

person Open the way    schedule 28.11.2010    source источник
comment
Это весь код или есть еще вложенные циклы?   -  person casablanca    schedule 28.11.2010
comment
нет, больше нет вложенных циклов   -  person Open the way    schedule 28.11.2010
comment
Я вижу ваше исправление и признаю, что оно работает так же, как и версия 1, но я не понимаю, почему вы заменяете прекрасное решение другим, использующим неинтуитивный набор goto s...   -  person Heinzi    schedule 28.11.2010
comment
причина здесь: stackoverflow.com/questions/4298194 /   -  person Open the way    schedule 28.11.2010


Ответы (2)


Это зависит от того, есть ли у цикла for какие-либо другие условия выхода.

  • В первом примере a=1 происходит только для этого конкретного условия выхода в операторе if.

  • Во втором примере a=1 происходит во всех сценариях выхода из цикла. Его можно обойти только с помощью оператора return или другого оператора goto.

person Stéphan Kochen    schedule 28.11.2010
comment
+1 за хороший ответ; Анализ потока — это ключ к распутыванию кода. - person Donal Fellows; 28.11.2010

Во второй версии a=1 в конечном итоге выполняется, хотя condition было ложным, просто потому, что поток управления в конечном итоге достигает done: после того, как условие цикла больше не выполняется.

person Heinzi    schedule 28.11.2010
comment
@Werner: Используя версию 1? Нет, серьезно, это зависит от того, какое поведение вы хотите. Если вам нужно поведение версии 1, используйте версию 1. Если вам нужно поведение версии 1, но вы не можете использовать версию 1 по какой-либо причине, сообщите нам причину, чтобы мы могли предложить альтернативу. Самым простым решением было бы переместить a=1 обратно в условие. - person Heinzi; 28.11.2010