Atribuição (computação)
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ável ← expressã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ão → variá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]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 | = |
| |
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
- ↑ Feio, Rui Alberto Lopes (1986). Curso de Programação Fortran. Lisboa: Fundação Calouste Gulbenkian. 191 páginas. Depósito Legal nº 13449/86
- ↑ Moore, Lawrie (1980). Foundations of Programming with Pascal. New York: John Wiley & Sons. 238 páginas. ISBN 0-470-26939-1
- ↑ Lopes, Arthur Vargas (1997). Introdução à Programação com Ada 95. Canoas: Editora da Ulbra. 422 páginas. ISBN 85-85692-38-3
- ↑ 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
- ↑ a b MEYER, Bertrand (1992). Eiffel the Language. Hemel Hempstead: Prentice Hall International(UK). 594 páginas. ISBN 0-13-247925-7
- ↑ 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
- ↑ Iverson, Kenneth E. (1962). A Programming Language. New York: John Wiley and Sons. 286 páginas. Library of Congress Catalog card Number: 62-15180
- ↑ Zimermann, Carlos Jorge (1981). Processamento Interativo: a Linguagem de Programação APL. Rio de Janeiro: LTC. ISBN 85-216-0138-7
- ↑ 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
- ↑ Shelly, Gary B.; Cashman, Thomas J. (1972). Introduction to Computer Programming RPG (em inglês). Fullerton: Anaheim Publishing Company. ISBN 0-88236-225-9
- ↑ Graham, Paul (1996). Ansi Common Lisp. New Jersey: Prentice Hall. ISBN 0-13-370875-6
- ↑ Steele, Guy L. (1990). Common Lisp - The Language. Lexington: Digital Press. ISBN 1-55558-041-6
- ↑ a b DYBVIG, R. Kent (1996). The Scheme Programming Language. Ansi Scheme. New Jersey: Prentice Hall PTR. ISBN 0-13-454646-6
- ↑ Abelson, Harold; Sussman, Gerald Jay; Sussman, Julie (1996). Structure and Interpretation of Computer Programs. New York: McGraw-Hill. ISBN 0-07-000484-6
- ↑ INMOS Limited (1988). Occam 2 Reference Manual. New York: Prentice Hall. 1330 páginas. ISBN 0-13-629312-3
- ↑ a b Lutz, Mark (2001). Python programming language 2ª ed. Sebastopol: O´Reilly. 1255 páginas. ISBN 0-596-00085-5
- ↑ Wall, Larry; Christiansen, Tom; Schwartz, Randal C. (1996). Perl programming language 2ª ed. Cambridge: O´Reilly. 645 páginas. ISBN 1-56592-149-6
- ↑ 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
- ↑ D.W. Barron et al., "The main features of CPL", Computer Journal 6:2:140 (1963). full text (subscription)
- ↑ 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
- ↑ 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
- ↑ DOUGHERTY, Dale; ROBBINS, Arnold (1997). Sed & Awk. Beijing: O´Reilly. 407 páginas. ISBN 1-56592-225-5
- ↑ Wirth, Niklaus (1989). Programming in Modula-2 4ª ed. [S.l.: s.n.] ISBN 0-387-50150-9
- ↑ 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