Estrutura de controle: diferenças entre revisões

Conteúdo apagado Conteúdo adicionado
Linha 1:
Em [[ciência da computação]], '''estrutura de controle''' (ou '''fluxo de controle''') refere-se à ordem em que instruções, expressões e chamadas de função são executadas ou avaliadas em [[programa de computador|programas de computador]] sob [[programação imperativa]] ou [[programação funcional|funcional]].
 
Os tipos de estruturas de controle disponíveis diferem de [[linguagem de computador|linguagem]] para linguagem, mas podem ser cruamente caracterizados por seus efeitos. O primeiro é a continuação da execução em uma outra instrução, como na [[estrutura sequencial]] ou em uma instrução <code>jump</code>. O segundo é a execução de um bloco de código somente se uma condição é verdadeira, uma [[estrutura de seleção]]. O terceiro é a execução de um bloco de código enquanto uma condição é verdadeira, ou de forma a iterar uma coleção de dados, uma [[estrutura de repetição]]. O quarto é a execução de instruções distantes entre si, em que o controle de fluxo possivelmente volte para a posição original posteriormente, como chamadas de [[subrotinas]] e [[corotina]]s. O quinto é a parada do programa de computador.
 
[[Interrupção de hardware|Interrupções]] e [[Sinal (ciência da computação)|sinais]] são mecanismos de baixo nível que podem alterar o fluxo de controle de forma similar a uma sub-rotina, mas geralmente em resposta a algum estímulo externo ou um evento ao invés de uma estrutura de controle em uma linguagem.
 
Em nível de [[linguagem de máquina]], as instruções de estruturas de controle geralmente funcionam ao alterar o [[contador de programa]]. Para algumas [[CPU]]s, as únicas instruções de estruturas de controle disponíveis são os diversos tipos de <code>jump</code> condicional.
 
== Primitivas ==
=== Etiquetas ===
 
Uma etiqueta é um nome ou um número explícito atribuído a uma posição fixa no [[código fonte]], e pode ser referenciada pelas instruções de fluxo de controle. Um exemplo é a atribuição de um número para cada linha do código fonte, frequente em linguagem de máquina.
 
Outras linguagens como [[C (linguagem de programação)|C]] definem uma etiqueta como um [[identificador]], geralmente aparecendo no início da linha, como por exemplo:
 
<source lang="c">
Sucesso:
printf ("The operation was successful.\n");
</source>
 
=== Goto ===
{{AP|[[goto (programação)]]}}
O <code>goto</code> é a forma mais simples de transferência de controle incondicional, e seu efeito é fazer com que a próxima instrução executada seja aquela imediatamete após a etiqueta indicada.
 
O notável [[cientista da computação]] [[Edsger Dijkstra]] tinha posição contrária ao comando, até então um recurso bastante comum na programação da época, o que culminou no artigo de [[1968]] "A Case against the GO TO Statement"<ref>
{{citar web
|url=http://www.acm.org/classics/oct95/
|titulo=Go To Statement Considered Harmful (EWD215)
|autor= Edger Dijkstra
|data=Março de [[1968]]
|publicado=Communications of the [[Association for Computing Machinery|ACM]]
|lingua=[[Língua inglesa|inglês]]
}}</ref>. Dijkstra alegava que o artifício era motivo para vários erros de programação. O artigo é considerado como um grande passo para a depreciação do comando em prol de estruturas de controle como o [[laço de repetição]]. O título mais famoso para o artigo, "Go To Statement Considered Harmful", foi um trabalho não de Dijkstra mas de Niklaus Wirth, então editor da ''Communications of the ACM'', onde o artigo foi publicado.
 
=== Sub-rotinas ===
{{AP|[[Subrotina]]}}
A terminologia de sub-rotina varia, pois ela pode ser conhecida como rotina, procedimento, função ou método. Durante a [[década de 1950]], a [[memória (computador)|memória]] disponível em computadores era pequena, e as sub-rotinas reduziam o tamanho dos programas ao resumir somente uma vez alguma rotina que poderia ser usada em diversas partes do código. Atualmente elas são usadas para ajudar na estruturação dos programas, isolando algoritmos ou ainda encapsulando algum método.
 
==Estruturas==
===Estrutura sequencial===
{{AP|[[Estrutura sequencial]]}}
Uma estrutura sequencial realiza um conjunto predeterminado de comandos de forma sequencial, na ordem em que foram declarados no código fonte. A cada instrução, o [[contador de programa]] é incrementada.
 
===Estrutura de seleção===
{{AP|[[Estrutura de seleção]]}}
Também chamada de expressão condicional ou ainda construção condicional, a estrutura de seleção realiza diferentes computações ou ações dependendo se a seleção (ou condição) é verdadeira ou falsa. A condição é uma expressão processada e transformada em um valor booleano.
 
===Estrutura de repetição===
{{AP|[[Estrutura de repetição]]}}
Uma estrutura de repetição realiza e repete diferentes computações ou ações dependendo se uma condição é verdadeira ou falsa, condição essa que é um expressão processada e transformada em um valor booleano. Está associado a ela além da condição (também chamada "expressão de controle" ou "condição de parada") o bloco de código: verifica-se a condição, e caso seja verdadeira, o bloco é executado. Após o final da execução do bloco, a condição é verificada novamente, e caso de pilasela ainda seja verdadeira, o código é executado novamente.
 
Deve-se observar que, caso o bloco de código nunca modificar o estado da condição, a estrutura será executada para sempre, uma situação chamada [[laço infinito]]. Da mesma forma, é possível especificar uma estrutura em que o bloco de código modifica o estado da condição, mas esta é sempre verdadeira.