Atribuição (computação)

Origem: Wikipédia, a enciclopédia livre.

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