notas-de-aula- Schneider
29 pág.

notas-de-aula- Schneider


DisciplinaProgramação I21.793 materiais249.980 seguidores
Pré-visualização11 páginas
de parâmetros\u201d mais o tipo de retorno se o 
subprograma for uma função. Pode ser visto como o tipo do subprograma.
2.5.1.3 Parâmetros
São uma forma de fornecer os dados para o processamento de um subprograma. Deixam o 
subprograma mais legível que o uso de variáveis externas. O escopo reduzido ajuda a evitar erros. 
Eles também são usados para receber dados resultantes do processamento dos subprogramas.
Parâmetros podem ser dados ou subprogramas.
A vinculação entre parâmetros reais e formais por ser feita pela posição ou pelo nome. Em algumas 
linguagens pode-se usar a duas formas ao mesmo tempo (ex.: Ada e Python).
Nem sempre é obrigatório usar todos os parâmetros. Nesse caso é preciso existir alguma regra a 
respeito daqueles não vinculados.
Nem sempre é preciso definir um número fixo de parâmetros. Nesses casos, parâmetros são 
geralmente vistos como elementos de um vetor ou lista.
São geralmente variáveis stack-dinâmicas.
2.5.1.4 Procedimentos e Funções
Procedimentos produzem resultados alterando estados de variáveis externas no programa (efeitos 
colaterais) já que não retornam valor. As variáveis não são necessariamente visíveis no programa. 
Por exemplo: o procedimento write do Pascal altera o estado da saída padrão, por isso podemos 
dizer que sua execução altera variáveis externas apesar disso não ficar muito visível no programa. 
Sabemos que essas variáveis são externas ao write pois outros procedimentos têm acesso à saída 
padrão.
Funções são modelos das funções matemáticas mas que, ao contrário delas, podem apresentar 
efeitos colaterais. São \u201csubstituídas\u201d por um valor (ver 2.5.3.2) e geralmente usadas dentro de 
expressões. Podem ser entendidas como operadores.
prof. Bruno Schneider 18
Notas de Aula de GCC105 - BCC e BSI - UFLA
As funções são mais genéricas que os procedimentos já que podem fazer tudo o que eles fazem e 
ainda retornar um valor. Apesar disso, algumas linguagens reduzem ou limitam completamente (no 
caso de linguagens não procedurais) a possibilidade de criação de efeitos colaterais numa função, 
aproximado-as das funções matemáticas e tornando-as distintas dos procedimentos.
Em algumas linguagens (como C, C++ e Java) não existem procedimentos e as funções não 
precisam fazer parte de uma expressão.
2.5.2 Ambientes de referência locais
Subprogramas são peças importantes do controle de escopo, indicando limites para a vinculação de 
nomes.
Geralmente as variáveis locais são stack-dinâmicas. Para permitir maior velocidade, algumas 
linguagens ainda usam a vinculação estática ao armazenamento, usando variáveis stack-dinâmicas 
somente nos subprogramas recursivos. Em algumas linguagens é necessário declarar explicitamente 
quando um programa é recursivo.
2.5.3 Métodos de passagem de parâmetros
Os parâmetros são uma forma boa de transmitir dados para dentro e para fora de um subprograma. 
Os parâmetros formais podem ser usados para (a) receber dados dos parâmetros reais, (b) 
transmitir dados para os parâmetros reais ou (c) ambos. Esses três modelos são conhecidos por (a) 
modo entrada, (b) modo saída ou (c) modo entrada/saída.
2.5.3.1 Passagem por valor
O valor do parâmetro real é usado na inicialização do parâmetro formal. Esse, por sua vez, funciona 
como uma variável local. Implementa o modo entrada.
É um método seguro, mas requer tempo e armazenamento extra para a cópia.
A passagem de ponteiros por valor pode ser confundida com a passagem por referência quando o 
valor de uma variável é uma referência (ex.: ponteiros). Nesse caso, a passagem por valor pode 
causar o mesmo efeito de uma passagem por referência (alteração do valor do parâmetro real). Na 
linguagem Java, em que as variáveis podem ser referências, sem que isso fique explícito para o 
programador, essa confusão é maior.
A passagem por valor deve ser preferida pelo programador nos casos em que se deseja o modo de 
entrada e que a quantidade de informações passadas é pequena.
O livro texto usa as expressões "mudança física" e "transferência física" na explicação desta 
implementação de passagem de parâmetros. Esses termos não foram definidos e costumam induzir 
uma ideia inapropriada do processo de transferência de valores; eles devem ser evitados.
2.5.3.2 Passagem por resultado
O parâmetro funciona como uma variável local, cujo valor é copiado para o parâmetro real ao final 
do subprograma. Implementa o modo saída.
O parâmetro real deve ser apropriado ao recebimento de valores, ou seja, deve estar associado a um 
left value.
Pode causar problemas na ocorrência de colisão entre parâmetros reais (um único parâmetro real 
prof. Bruno Schneider 19
Notas de Aula de GCC105 - BCC e BSI - UFLA
vinculado a dois ou mais parâmetros formais). Pode causar semântica ambígua em função do 
momento em que se determina o endereço de retorno.
Assim como a passagem por valor, exige mais tempo e armazenamento.
Os compiladores costumam usar este método para retornar o valor de função. Esse retorno é um 
parâmetro especial, no sentido de que ele não aparece junto dos outros parâmetros e o parâmetro 
real não é vinculado a um nome. Isso ajuda na redução dos problemas do método.
2.5.3.3 Passagem por valor-resultado
É a cópia do valor para um armazenamento separado durante chamada e durante o encerramento do 
subprograma. É uma implementação do modo entrada/saída.
Tem as desvantagens da passagem por valor e as da passagem por resultado.
2.5.3.4 Passagem por referência
Transfere uma referência (geralmente um endereço) ao invés do valor, de forma que o parâmetro 
formal passa a ser um apelido (alias) do parâmetro real. É uma implementação do modo 
entrada/saída.
Essa forma de passagem de parâmetros é tida como rápida porque uma referência é uma quantidade 
pequena de informação e tem sempre o mesmo tamanho, independentemente do tamanho do valor a 
que se refere. Entretanto, é possível que o tempo e espaço necessários para passagem de uma 
referência sejam iguais ou maiores que os necessários para a cópia de um valor. Assim, a passagem 
por referência de grandes quantidades de informação é mais rápida que a passagem por valor, o que 
torna este método vantajoso mesmo em situações nas quais o programador deseja o modo de 
entrada.
A passagem por referência cria efeitos colaterais e por isso deve ser evitada quando se deseja 
apenas o modo entrada de pouca informação.
Da mesma forma que a passagem por resultado, pode causar problemas na ocorrência de colisão de 
parâmetros reais. Pode criar apelidos (aliases) que dificultam a leitura do código (ex.: o parâmetro 
pode ser um alias para uma variável global).
Apesar de ser bastante comum, costuma não ser oferecida por linguagens que escondem o 
gerenciamento de memória do programador (ex.: Java).
Algumas linguagens permitem a passagem por referência constante, na qual o parâmetro formal é 
tratado como constante, mesclando as vantagens deste método com a segurança do modo de entrada 
(ex.: C++). Nas linguagem sem esse recurso, a passagem de uma constante por referência não deve 
ser permitida pelo compilador, pois poderia permitir a alteração do valor de uma constante.
Na linguagem C++ é permitido dizer que o valor de retorno de uma função é passado por 
referência.
2.5.3.5 Passagem por nome
A passagem por nome é muito diferente das outras formas. Nela, o parâmetro formal é textualmente 
substituído pelo parâmetro real. Isso pode ser implementado de várias formas, com semânticas 
diferentes.
Por exemplo, se o parâmetro real for uma expressão constante, pode-se usar uma implementação 
prof. Bruno Schneider 20
Notas de Aula de GCC105 - BCC e BSI - UFLA
como a da passagem por valor (semântica de entrada). Se for uma variável, pode-se usar uma 
implementação como a passagem por referência (semântica de entrada/saída).
2.5.4 Parâmetros que são nomes de subprogramas
Muitas