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 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, C, Java, PL/I, Windows PowerShell, Bourne shell, … |- | variável := expressão || ALGOL, Pascal, Ada, Dylan, Eiffel … |- | 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 |- | 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

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

| style="padding-right: 1em" | MOVE expressão TO variável || COBOL |- | style="padding-right: 1em" | 1º fator ADD 2º fator campo resultante || RPG |- | style="padding-right: 1em" | expressão → variável || TI-BASIC, Casio BASIC |- | style="padding-right: 1em" | expressão -> variável || R

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

| style="padding-right: 1em" | (setq variável expressão ) || Lisp, Common Lisp |- | style="padding-right: 1em" | (set! variável expressão ) || Scheme |- | style="padding-right: 1em" | (setf variável expressão ) || Common Lisp

Operação 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 Algumas linguagens de programação, tais como occam2, Python, Perl, Ruby, 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'. D.W. Barron et al., "The main features of CPL", Computer Journal 6:2:140 (1963). full text (subscription)

Valor de uma atribuição 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.

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

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.

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

Categoria:Tópicos em linguagens de programação Categoria:Construções de programas