Para um matemático, a linha

$$x = x + 1$$

é uma equação sem solução: subtraindo $x$ dos dois lados, sobra $0 = 1$. Para um programador, é uma das linhas mais comuns que existem, e quer dizer “pegue o valor de $x$, some um e guarde o resultado em $x$”. O mesmo sinal, nas duas comunidades, faz trabalhos opostos: lá ele afirma uma igualdade; aqui ele manda fazer uma atribuição.

O Fortran escolheu o igual

O responsável foi o Fortran, a primeira linguagem de programação de alto nível de uso amplo, criada na IBM por uma equipe liderada por John Backus e lançada em 1957. Os programas eram perfurados em cartões, um comando por cartão, e o teclado das perfuradoras tinha poucos sinais. Para dizer “guarde em $N$ o valor $27$”, o Fortran escreveu N=27, como na fórmula de um engenheiro.

Cartões perfurados com comandos em Fortran. No segundo cartão, `N=27` não afirma que N é igual a 27: manda guardar 27 em N.
Cartões perfurados com comandos em Fortran. No segundo cartão, N=27 não afirma que N é igual a 27: manda guardar 27 em N.Tangopaso · Wikimedia Commons · domínio público

A escolha era prática e ficou. Mas incomodou quem pensava a programação como matemática. A linguagem Algol, criada por um comitê internacional entre 1958 e 1960, usou outro sinal para a atribuição, :=, e deixou o = para a comparação. O suíço Niklaus Wirth manteve o := no Pascal (1970), e Donald Knuth, em The Art of Computer Programming, escreve a atribuição com uma seta: $x \leftarrow x + 1$. O APL de Iverson também usava a seta, e a linguagem estatística R a herdou como <-.

O == da linguagem C

A linguagem C, criada em 1972, seguiu o Fortran: = atribui. Para comparar, precisou de outro sinal e dobrou o igual: ==. A consequência é um dos erros mais famosos da programação:

if (x = 0) { ... }

O programador queria perguntar se $x$ é zero. Escreveu um igual só e mandou pôr zero em $x$. Como o valor da atribuição é $0$, que a linguagem C lê como “falso”, o bloco nunca é executado, e o valor anterior de $x$ se perde em silêncio. Muitos compiladores modernos avisam quando encontram essa linha, justamente porque o sinal tem dois sentidos para quem vem da matemática.

O que a matemática ganhou

A atribuição não é uma igualdade, mas ela trouxe para a escrita uma ideia que a matemática tradicional quase não escrevia: o tempo. Em x = x + 1, o $x$ da esquerda e o da direita são o mesmo nome em dois instantes. A matemática expressa isso com índices, $x_{n+1} = x_n + 1$, como nas sequências e nos métodos iterativos de Newton. A programação mostrou que dá para escrever algoritmos inteiros pensando no nome como uma caixa cujo conteúdo muda, e essa maneira de pensar voltou para a matemática pelos livros de algoritmos.

Para quem aprende, as duas leituras convivem mal. O capítulo 4 mostrou que o igual da escola já tinha muitos trabalhos; o igual dos computadores acrescentou mais um, o de ordem. Distinguir “afirmo que” de “faça com que” é uma das coisas que se aprende ao passar de uma comunidade para a outra.

Exercício: siga o programa

Um programa executa, em ordem: x = 3, x = x + 1, x = 2 * x. Qual é o valor final de $x$? E se as três linhas fossem equações?

Como programa: $x$ vale $3$, depois $4$, depois $8$. Como equações, o sistema $x = 3$, $x = x + 1$, $x = 2x$ não tem solução (a segunda é impossível, e a terceira só vale para $x = 0$). Reescrevendo com índices, $x_0 = 3$, $x_1 = x_0 + 1 = 4$, $x_2 = 2x_1 = 8$, as três linhas voltam a ser igualdades verdadeiras.

Exercício: o erro do if

Por que if (x == 0) funciona e if (x = 0) não, em C? O que um matemático escreveria?

x == 0 compara e vale verdadeiro ou falso conforme $x$. x = 0 atribui zero a $x$ e vale $0$, que conta como falso: a condição nunca é satisfeita, e $x$ é apagado. Um matemático escreveria simplesmente “se $x = 0$”, porque na escrita matemática o igual dentro de uma condição só pode ser comparação.


Índice do capítulo · ← A notação como ferramenta de pensamento: Iverson · Os nomes nos teoremas: a lei de Stigler →