terça-feira, junho 23, 2009

Do you really know C

I don't like to write about C because Wanderley, a friend of mine, is much more able to talk about it, but I think I must report what happened to me these days.

After some time developing with a programming language we get so used to it that we start thinking we are the master on it.

But usually the opposite happens: we forget some basic and subtle aspects of the language.

A couple of days ago I wrote the C command bellow:
printf("x position = %d (again??)", 7);
and to my surprise it was printed
x position = 7 (again ]
Why didn't the application printed
x position = 7 (again ??)
I thought "Visual Studio (2005) is a crap!".

Some taboo words latter and I realized what the problem was.

I remembered C has a feature named trigraph. In other words, C replaces all special sequences of three characters by their single-character equivalent.

The following are the nine trigraph sequences that C recognizes.
Trigraph    Equivalent
??=         #
??/         \
??'         ^
??(         [
??)         ]
??!         |
??<         {
??>         }
??-         ~
Why do C has trigraphs? To let us for writing source code when the keyboard being used does not support any of these nine characters.

I compiled the program using gcc and it gives me the following warning
warning: trigraph ??) ignored, use -trigraphs to enable
This means that on gcc we must explicitly request to it to enable trigraphs. The output presented after running the program was
x position = 7 (again ??)
Since 1994 the C standard (C99), supplies digraphs as more readable alternatives to six of the trigraphs. They are:
Digraph     Equivalent
<:      [
:>      ]
<%      {
%>      }
%:      #
%:%:    ##
I must not be so proud of myself because eventually something (like this) remembers me that I am already a newbie and a wanna-be.

Oh, and at this time Visual Studio was unfairly blamed. Sorry ;)

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 ;)