# 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

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ãoBASIC, Fortran, C, Java, PL/I, Windows PowerShell, Bourne shell, … variável := expressãoALGOL, Pascal, Ada, Dylan, Eiffel … variável << expressãoMagik
Outras possibilidades incluem uma seta para a esquerda ou uma palavra-chave, embora existam outras, variantes mais raras:
    variável <- expressãoObjective Caml, S, R, ... variável ← expressãoAPL LET variável = expressãoBASIC set variável to expressãoAppleScript set variável = expressãoC shell Set-Variable variável (expressão)Windows PowerShell variável : expressãoMacsyma, Maxima val variável = expressãoML
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 expressão → variável TI-BASIC, Casio BASIC 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:
    (setq variável expressão )Lisp, Common Lisp (set! variável expressão )Scheme (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:
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:
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:
A lista será descompactado de forma que 0 é atribuído a a e 1 a b. Mais interessante,
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
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'.

### 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 | = | | |
| PL/M | operator | := | | |
| Turbo Prolog | instrução | = | | |
| Snobol – versão Mainbol | instrução | = | | |
| Snobol – versão Spitbol | operador | = | | |
| Visual Basic (Visual Studio 2008) | operador | = | +=, -=, *=, /=, \=, ^=, >>=, <<=, &=, | |