2012-04-23 6 views
0

В моей попытке получить более полное знание процедурной программы, как для практического, так и для академического использования, я пытаюсь прояснить, какие действия CONTINUE и BREAK имеют в состоянии.GOTO, CONTINUE, BREAK в процедурных программах, как они влияют на состояние?

Я пришел к пониманию того, что GOTO по существу запрещен, так как я иду, если вы хороший программист, вы можете найти лучший способ подхода. Однако я также понимаю на более глубоком уровне, что его следует избегать в процедурном программировании, потому что ему не хватает возможности изменить состояние.

Это было, я запутался, как это ПРОДОЛЖИТЬ, и BREAK может изменить состояние?

Моя первая мысль была, что, поскольку GOTO как таковой:

GOTO A; 
LBL A; 

не оцениваются Нет выражения и ни одно государство не меняется. И в сочетании с формой CONTINUE:

while (evalFunction(*value) == 1) { 
    .. 
    if (bail == 1) continue; 
    .. 
} 

Имеет возможность изменить состояние в состоянии while.

Однако это не относится к BREAK.

Может ли кто-нибудь предоставить более подробную информацию о специфике процедурного программирования?

+0

Как «продолжить» изменение состояния в состоянии while? «break» sort-of changes означает, что условие вообще не будет проверено, что похоже на изменение результата условия - по крайней мере, если условие имеет побочные эффекты. В противном случае никакое состояние не будет изменено иначе, чем завершение цикла. Однако я могу не понимать, что вы просите. –

+0

Я сделал редактирование в цикле, продолжение может вызвать изменение состояния, вызвав функцию в условии. Я, честно говоря, могу просто понять то, что должно было быть более «одним из многих причин избежать GOTO». – RyanS

ответ

4

Я не знаю, откуда эта «способность изменять состояние».

Наивысшая ценность кода - читаемость. GOTO следует избегать, поскольку он часто делает код трудным для чтения и ни по какой другой причине. На самом деле существуют случаи, когда код, который использует GOTO, является проще, чтобы читать, чем это было бы, если бы GOTO избегали, и в этих случаях GOTO должен использоваться. Хороший пример может служить С вложенной очисткой идиома:

int do_something() 
{ 
    int rv = -1; /* failure */ 
    Foo *foo = get_a_foo(); 
    if (!foo) goto out; 
    Bar *bar = get_a_bar(); 
    if (!bar) goto out_foo; 

    rv = do_something_with_foo_and_bar(foo, bar); 

    release_bar(bar); 
out_foo: 
    release_foo(foo); 
out: 
    return rv; 
} 

Это легче читать, чем альтернатива с вложенным если заявлениями, потому что нормальный поток управления подчеркивается. (В C++ вы бы использовать RAII вместо этого, конечно, еще меньше помех.)

Аналогично, BREAK и CONTINUE может сделать код труднее читать, и его следует избегать, когда они делают; однако они почти в каждом современном языке, потому что они часто делают код проще для чтения. Таким образом, они предпочитают для сложных if-else конструкций внутри циклов и/или искажения логики, так что условие выхода цикла может быть проверено в верхней части цикла.

+0

+1 для подчеркивания ** удобочитаемости **. – Sjoerd

+0

Благодарим за отзыв. Я очень хорошо знаком с идеей читаемости и утверждения GOTO. Однако это ничего не говорит о BREAK и CONTINUE. – RyanS

+0

Также я забочусь о состоянии, потому что он имеет основополагающее значение для процедурного программирования, где целью является следовать инструкциям, чтобы получить желаемое изменение состояния. – RyanS