Estrutura de controle

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 programas de computador sob programação imperativa ou funcional.

Os tipos de estruturas de controle disponíveis diferem de 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 jump. 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 corotinas. O quinto é a parada do programa de computador.

Interrupções e 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 CPUs, as únicas instruções de estruturas de controle disponíveis são os diversos tipos de jump condicional.

Primitivas

editar

Etiquetas

editar

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 definem uma etiqueta como um identificador, geralmente aparecendo no início da linha, como por exemplo:

Sucesso:
printf ("The operation was successful.\n");
 Ver artigo principal: goto (programação)

O goto é a forma mais simples de transferência de controle incondicional, e seu efeito é fazer com que a próxima instrução executada seja aquela imediatamente 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"[1]. 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

editar
 Ver artigo principal: 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 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

editar

Estrutura sequencial

editar
 Ver artigo principal: 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 é incrementado.

Estrutura de seleção

editar
 Ver artigo principal: 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

editar
 Ver artigo principal: 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 ela 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.

Algumas linguagens de programação especificam ainda uma palavra reservada para sair da estrutura de repetição de dentro do bloco de código, "quebrando" a estrutura. Também é oferecido por algumas linguagens uma palavra reservada para terminar uma iteração específica do bloco de código, forçando nova verificação da condição.

Referências

  1. Edger Dijkstra (Março de 1968). «Go To Statement Considered Harmful (EWD215)» (em inglês). Communications of the ACM. Consultado em 28 de novembro de 2007. Arquivado do original em 3 de julho de 2007