# 7. Expressões de Atribuição

Como conceito geral em programação, uma atribuição é uma construção que armazena um novo valor em um local onde valores podem ser armazenados — por exemplo, em uma variável. Esses locais são chamados de *lvalues* (veja [*Lvalues*](#user-content-fn-1)[^1]) porque são locais (por isso o "l") que armazenam um valor.

Uma atribuição em C é uma expressão porque possui um valor; chamamos isso de expressão de atribuição. Uma atribuição simples se parece com:

```c
lvalue = valor-para-armazenar
```

Dizemos que ela atribui o valor da expressão `valor-para-armazenar` ao local `lvalue`, ou que armazena `valor-para-armazenar` lá. Você também pode pensar no "l" de "lvalue" como significando "esquerda" *(left)*, já que é o que você coloca no lado esquerdo do operador de atribuição.

No entanto, essa não é a única forma de usar um *lvalue*, e nem todos os *lvalues* podem ser atribuídos. Para usar o *lvalue* no lado esquerdo de uma atribuição, ele precisa ser modificável. Em C, isso significa que ele não foi declarado com o qualificador de tipo `const` (veja [*const*](#user-content-fn-1)[^1]).

O valor da expressão de atribuição é o de `lvalue` após o novo valor ser armazenado nele. Isso significa que você pode usar uma atribuição dentro de outras expressões. Os operadores de atribuição são associativos à direita, de modo que:

```c
x = y = z = 0;
```

é equivalente a:

```c
x = (y = (z = 0));
```

Essa é a única maneira útil para associá-los; a outra maneira,

```c
((x = y) = z) = 0;
```

seria inválida, pois uma expressão de atribuição como `x = y` não é válida como um *lvalue*.

{% hint style="info" %}
Quando o texto diz que o valor de expressão de atribuição é o de `lvalue`, quer dizer que a expressão "retorna" o `lvalue`. Por exemplo, `i = 10` "retorna" 10. Ou seja, se essa expressão de atribuição inteira for utilizada à direita de um operador de atribuição, o valor dela será `10`.
{% endhint %}

Aviso: Coloque parênteses ao redor de uma atribuição se você a aninhar dentro de outra expressão, a menos que seja uma expressão condicional, uma série separada por vírgulas ou outra atribuição.

[^1]: Capítulo pendente de tradução


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://mentebinaria.gitbook.io/manual-da-linguagem-gnu-c/7.-expressoes-de-atribuicao.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
