terça-feira, junho 23, 2009

Você conhece mesmo o C

Eu não gosto de escrever sobre C, porque o meu amigo Wanderley é muito mais abilitado para falar sobre o assunto (além de escrever de um modo bem divertido), mas eu acho que eu devo falar sobre o que aconteceu comigo estes dias.

Após algum tempo desenvolvendo com uma linguagem de programação nós nos acostumamos a ela e começamos a achar que a dominamos.

Mas, geralmente, o que ocorre é o contrário: nós esquecemos alguns aspectos mais básicos e sutis da linguagem.

Alguns dias atrás eu escrevi o seguinte trecho de código em C:
printf("x position = %d (again??)", 7);
e, para minha surpresa, foi impresso
x position = 7 (again ]
Por que o programa não imprimiu
x position = 7 (again ??)
Eu pensei "esse Visual Studio é uma merda!". Alguns palavrões depois e eu percebi qual era o problema.

Eu lembrei que o C tem um recurso chamado trígrafo. Em outras palavras, o C substitui todas as ocorrências de sequências especiais de três caracteres por seus equivalentes de caracter único.

A seguir temos as nove sequências de trígrafos que o C reconhece.
Trigraph     Equivalent
??=          #
??/          \
??'          ^
??(          [
??)          ]
??!          |
??<          {
??>          }
??-          ~
E por que o C suporta trígrafos? Para nos permitir escrever códigos fonte quando o teclado que estiver sendo usado não possuir suporte aos nove caracteres acima.

Eu compilei o programa usando o gcc e obtive o seguinte warning
warning: trigraph ??) ignored, use -trigraphs to enable
Ou seja, eu devo explicitamente habilitar o uso de trígrafos no gcc. A saída do programa após executá-lo foi
x position = 7 (again ??)
Desde 1994 o padrão do C (C99) fornece suporte a dígrafos como uma alternativa mais legível a seis dos nove trígrafos. São eles:
Digraph  Equivalent
<:                    [
:>                    ]
<%                  {
%>                  }
%:                   #
%:%:              ##
Eu não devo me sentir tão orgulhoso de mim, porque sempre termina acontecendo algo desse tipo para me lembrar que eu ainda tenho muito para aprender.

Ah, e dessa vez o Visual Studio foi xingado injustamente. Desculpem-me ;)

2 comentários:

Wanderley Caloni disse...

Márcio.

É lógico que você tem que escrever mais sobre C. Afinal de contas, meu blogue só é conhecido porque quase ninguém (ainda) realmente escreve sobre programação C nesse país.

E com certeza esses detalhes da linguagem fazem muito diferença para quem está quebrando a cabeça em algum lugar tentando entender porque o seu ??) virou ] de uma hora para outra. Agora uma busca no google já retornaria esse artigo esclarecedor entre os top 10.

[]s

Marcio Andrey Oliveira disse...

Wanderley, obrigado pelos comentários.

Mas eu prefiro muito mais ler teus artigos. São muito bons.