Atribuição (computação)

Origem: Wikipédia, a enciclopédia livre.
Ir para: navegação, pesquisa

Em Ciência da Computação o comando de atribuição define ou re-define o valor armazenado no local de armazenamento indicado por um nome de variável. Na maioria das linguagens de programação imperativas o comando de atribuição é uma das declaração básicas.

A instrução de atribuição muitas vezes permite que o mesmo nome de variável possa conter valores diferentes em momentos diferentes durante a execução do programa.

Notação[editar | editar código-fonte]

Representações textuais comuns do operador de atribuição incluem um sinal de igual ("=") e ":=". Estas duas formas são típicas das linguagens de programação (tais como C), que classificam o operador de atribuição como um operador infixo.

variável = expressão BASIC, Fortran[1] , C, Java, PL/I, Windows PowerShell, Bourne shell, …
variável := expressão ALGOL, Pascal[2] , Ada[3] , Dylan[4] , Eiffel[5] [6]
variável << expressão Magik

Outras possibilidades incluem uma seta para a esquerda ou uma palavra-chave, embora existam outras, variantes mais raras:

variável <- expressão Objective Caml, S, R, ...
variávelexpressão APL[7] [8]
LET variável = expressão BASIC
set variável to expressão AppleScript
set variável = expressão C shell
Set-Variable variável (expressão) Windows PowerShell
variável : expressão Macsyma, Maxima
val variável = expressão ML[9]

Algumas plataformas colocam a expressão à esquerda e à variável à direita:

MOVE expressão TO variável COBOL
1º fator ADD 2º fator campo resultante RPG[10]
expressãovariável TI-BASIC, Casio BASIC
expressão -> variável R

Algumas linguagens funcionais como Lisp, Common Lisp[11] [12] e Scheme[13] [14] tem funções como uma forma genérica de atribuir valores para estruturas de dados, para espelhar os left-values de outros linguagens:

(setq variável expressão ) Lisp, Common Lisp
(set! variável expressão ) Scheme
(setf variável expressão ) Common Lisp

Operação[editar | editar código-fonte]

Semanticamente, uma operação de atribuição modifica o estado atual do programa de execução. Por conseguinte, a atribuição é dependente do conceito de variáveis. Em uma atribuição:

  • A expressão é avaliada no estado atual do programa.
  • À variável é atribuído o valor calculado, substituindo o valor anterior da variável.

Exemplo: Supondo que a é uma variável numérica, a atribuição a := 2*a significa que o conteúdo da variável a é dobrado após a execução da declaração.

Um exemplo de segmento de código na linguagem C:

int x = 10; 
float y;
x = 23;
y = 32.4;

Neste exemplo, a variável x é o primeiramente declarada como um int, e depois lhe é atribuído o valor de 10. Observe que a declaração e a atribuição ocorrem na mesma declaração. Na segunda linha, y é declarada sem uma atribuição como um float. Na terceira linha, a x é atribuído o valor de 23. Finalmente, a y é atribuído o valor de 32,4.

Para uma operação de atribuição, é necessário que o valor da expressão seja bem definido (é um valor válido) e que a variável representa uma entidade modificável válida. Em algumas linguagens, como o Perl, não é necessário declarar uma variável antes de atribuir um valor a ela.

Atribuições paralelas[editar | editar código-fonte]

Algumas linguagens de programação, tais como occam2[15] , Python[16] , Perl[17] , Ruby[18] , Windows PowerShell e JavaScript (desde a versão 1.7), permitem que diversas variáveis possam ser atribuídas, em paralelo, com sintaxes do tipo:

a,b := 0,1

que, simultaneamente, atribui 0 a a e 1 a b. Se o lado direito da atribuição é uma variável do tipo vetor ou matriz (mapeamento finito ou agregado homogêneo de dados), este recurso é às vezes chamado de seqüência de descompactação:

var list := 0,1
a,b := list

A lista será descompactado de forma que 0 é atribuído a a e 1 a b. Mais interessante,

a,b := b,a

Troca os valores de a e b. Em linguagens sem atribuição paralela, esta teria de ser escrita usando-se uma variável temporária

var t := a
a := b
b := t

desde que a:=b ; b:=a deixa ambas variáveis a e b com o valor original de b.

A atribuição paralela foi introduzida em CPL, em 1963, com o nome de 'atribuição simultânea'. [19]

Valor de uma atribuição[editar | editar código-fonte]

Na maioria das linguagens de programação orientada a expressões, a instrução de atribuição retorna o valor atribuído, permitindo expressões tais como x = y = a, a qual atribui o valor de a tanto a x quanto a y, e while (f = read ()) {}, que utiliza o valor de retorno de uma função para controlar um laço while atribuindo o mesmo valor a uma variável.

Em outras linguagens de programação, o valor de retorno de uma atribuição é indefinido e expressões desta forma são inválidas. Um exemplo é o Scheme[13] .

Em Python, a atribuição não é uma expressão e, portanto, não tem nenhum valor[16] .

Em Haskell, não há atribuição de variável; mas operações semelhantes a atribuição (como atribuir a um campo de uma matriz ou a um campo de uma estrutura de dados mutável) costumam avaliar para a unidade, o valor do tipo da unidade, que normalmente é o tipo de expressão que é avaliada apenas por seus efeitos colaterais[20] .

Atribuição versus atribuição única[editar | editar código-fonte]

Em programação funcional, a atribuição é desencorajada em favor da atribuição única, também chamada de vinculação de nome ou inicialização. A atribuição única difere da atribuição, conforme descrito neste artigo porque ela só pode ser feita uma vez, geralmente quando a variável é criada; nenhuma reatribuição posterior é permitida. Uma vez criada pela atribuição única, os valores amarrados aos nomes não são variáveis, mas objetos imutáveis.

Atribuição única é a única forma de atribuição disponível em linguagens puramente funcionais, como Haskell, que não possuem variáveis, no sentido de linguagens de programação imperativa. Linguagens funcionais "impuras" fornecem tanto o mecanismo de atribuição única bem como o de atribuição verdadeira (embora a atribuição verdadeira seja utilizada com menos freqüência do que em linguagens de programação imperativas). Por exemplo, em Scheme, tanto a atribuição única quanto a atribuição verdadeira podem ser usadas em todas as variáveis. Em OCaml, apenas a atribuição única é permitida para as variáveis, através da sintaxe: let name = value; porém atribuições verdadeiras, usando-se um operador de separação -, podem ser usadas em elementos de matrizes e strings, bem como campos de registros e objetos que foram explicitamente declarados mutáveis (o que significa que podem ser alterados após a sua declaração inicial) pelo programador.

Atribuição versus igualdade[editar | editar código-fonte]

Programadores novatos às vezes confundem atribuição com o operador relacional de igualdade, pois "=" significa a igualdade matemática e é usada para a atribuição em muitas linguagens. Mas a atribuição altera o valor de uma variável, enquanto os testes de igualdade testam se duas expressões têm o mesmo valor.

Em muitas linguagens, o operador de atribuição é um simples sinal de igual ("=") ao passo que o operador de equivalência é um par de sinais de igual ("=="); em algumas linguagens, como BASIC, um único sinal de igual é utilizado para ambas com a determinação feita pelo contexto no qual o símbolo está inserido.

Isso pode levar a erros se o programador esquecer que forma (=,==,:=) é apropriada. Este é um problema comum de programação com linguagens como a linguagem C, onde o operador de atribuição também retorna o valor atribuído, e pode ser validamente aninhado em expressões (da mesma forma que uma função retorna um valor ).

Linguagens de Programação[editar | editar código-fonte]

As linguagens de programação e os símbolos de atribuição
linguagem de programação tipo simples complexo Palavra chave
AWK[21] [22] operador = +=, -=, *=, /=, %=, /=, ^=
Basic instrução = LET
C, C++ operador = +=, -=, *=, /=, %=, >>=, <<=, &=, ^=, |=
Clipper operador := +=, -=, *=, /=, %=, **=
Cobol instrução =
  • COMPUTE
  • MOVE ... TO ...
Eiffel[5] [6] instrução  :=
Fortran instrução =
JavaScript operador = +=, -=, *=, /=, %=
Icon operador := <=, :=:, <=>, +:=, -:=, *:=, /:=, %:=, ^:=, <:=, <=:=, =:=, >=:=, >:=, ~:=,
++:=, --:=, **:=, ||:=, <<:=, >>:=, ~==:=, ?:=, |||:=, ===:=, ~===:=, &:=, @:=
Modula-2[23] instrução :=
Pascal instrução :=
PL/I instrução =
PL/M instrução =
operator :=
Turbo Prolog instrução =
Snobol[24] – versão Mainbol instrução =
Snobol – versão Spitbol operador
Visual Basic (Visual Studio 2008) operador = +=, -=, *=, /=, \=, ^=, >>=, <<=, &=,

Referências

  1. Feio, Rui Alberto Lopes. Curso de Programação Fortran. Lisboa: Fundação Calouste Gulbenkian, 1986. 191 p. Depósito Legal nº 13449/86
  2. Moore, Lawrie. Foundations of Programming with Pascal. New York: John Wiley & Sons, 1980. 238 p. ISBN 0-470-26939-1
  3. Lopes, Arthur Vargas. Introdução à Programação com Ada 95. Canoas: Editora da Ulbra, 1997. 422 p. ISBN 85-85692-38-3
  4. Feinberg, Neal; Keene, Sonya E.; Mathews, Robert O.; Withington, P. Tucker. Dylan Programming. Massachusetts: Addison Wesley, 1997. 412 p. ISBN 0-201-47976-1
  5. a b MEYER, Bertrand. Eiffel the Language. Hemel Hempstead: Prentice Hall International(UK), 1992. 594 p. ISBN 0-13-247925-7
  6. a b WIENER, Richard. An Object-Oriented Introduction to Computer Science Using Eiffel. Upper Saddle River, New Jersey, EUA: Prentice Hall, 1996. 378 p. ISBN 0-13-183872-5
  7. Iverson, Kenneth E.. A Programming Language. New York: John Wiley and Sons, 1962. 286 p. Library of Congress Catalog card Number: 62-15180
  8. Zimermann, Carlos Jorge. Processamento Interativo: a Linguagem de Programação APL. Rio de Janeiro: LTC, 1981. ISBN 85-216-0138-7
  9. Ullman, Jeffrey D.. Elements of ML Programming: ML97 Edition. Englewood Cliffs, New Jersey, EUA: Prentice Hall, 1998. 383 p. ISBN 0-13-790387-1
  10. Shelly, Gary B.; Cashman, Thomas J.. Introduction to Computer Programming RPG (em inglês). Fullerton: Anaheim Publishing Company, 1972. ISBN 0-88236-225-9
  11. Graham, Paul. Ansi Common Lisp. New Jersey: Prentice Hall, 1996. ISBN 0-13-370875-6
  12. Steele, Guy L.. Common Lisp - The Language. Lexington: Digital Press, 1990. ISBN 1-55558-041-6
  13. a b DYBVIG, R. Kent. The Scheme Programming Language: Ansi Scheme. New Jersey: Prentice Hall PTR, 1996. ISBN 0-13-454646-6
  14. Abelson, Harold; Sussman, Gerald Jay; Sussman, Julie. Structure and Interpretation of Computer Programs. New York: McGraw-Hill, 1996. ISBN 0-07-000484-6
  15. INMOS Limited. Occam 2 Reference Manual. New York: Prentice Hall, 1988. 1330 p. ISBN 0-13-629312-3
  16. a b Lutz, Mark. Python programming language. 2ª ed. Sebastopol: O´Reilly, 2001. 1255 p. ISBN 0-596-00085-5
  17. Wall, Larry; Christiansen, Tom; Schwartz, Randal C.. Perl programming language. 2ª ed. Cambridge: O´Reilly, 1996. 645 p. ISBN 1-56592-149-6
  18. Thomas, David; Hunt, Andrew. Programming Ruby: The Pragmatic Programmer´s Guide. Upper Saddle River: Addison Wesley, 2001. 564 p. ISBN 0-201-71089-7
  19. D.W. Barron et al., "The main features of CPL", Computer Journal 6:2:140 (1963). full text (subscription)
  20. Hudak, Paul. Tha Haskell School of Expression: Learning Functional Programming Through Multimedia. Cambridge: Cambridge University Press, 2000. 363 p. ISBN 0-521-64408-9
  21. AHO, Alfred V.; KERNIGAN, Brian K.; WEINBERGER, Peter J.. The AWK Programming Language. Reading, Massachusetts, EUA: Addison-Wesley, 1988. 210 p. ISBN 0-201-07981-X
  22. DOUGHERTY, Dale; ROBBINS, Arnold. Sed & Awk. Beijing: O´Reilly, 1997. 407 p. ISBN 1-56592-225-5
  23. Wirth, Niklaus. Programming in Modula-2. 4ª ed. [S.l.: s.n.], 1989. ISBN 0-387-50150-9
  24. GRISWOLD, Ralph E.; POAGE, J. F.; POLONSKY, I. P.. The SNOBOL4 Programming Language. 2ª ed. Englewood Cliffs, New Jersey: Prentice Hall, 1971. 256 p. ISBN 0-13-815373-6