Niveau :
Résumé : C
Le C est plus lisible que le perl, la preuve le code C (test.c) suivant est valide :
%:include <stdio.h> ??=define T 2 int main(void) ??< int n<:T:>; n??(0??) = 1; if(n<:0??) == 1) <% n??(1:> = ??- n<:0:>; %> else <% n??(1??) = n<:0:> ??! 2; %> n??(0??) ??'= 3; printf( " n0 = %d ??/ n1 = %d\n", n<:0:>, n<:1:> ); return 0; ??>
Je le dis et je le prouve :
$ gcc -trigraphs test.c $ ./a.out n0 = 2 n1 = -2
Hé oui, le C contient quelques spécifications plus ou moins oubliées qui vous permettent ces bizarreries. Il s'agit en fait des trigraphs et des digraphs. Les premiers (3 caractères dont les 2 premiers sont des ?) ont été inventé pour palier un manque dans les tables de caractères pré ASCII (on me souffle qu'en fait c'est post ASCII), dont le petit nom est ISO 646. À l'époque de l'unicode ceci est toujours valable (par une option du compilateur il est vrai).
La deuxième série de caractère spéciaux (basée sur des <, >, % et :) a été introduite en 1999 ! Hé oui, la première écriture était trop peu lisible et devait être simplifiée ...
On peut ainsi créer un bug en C99 sans s'en rendre compte avant longtemps. Exemple :
int a; a=1; // Algo a la Kevin ?????????????????/ a++;
Exercice : Pour ceux qui suivent, trouvez la signification de chacun des groupes de caractères. Vous avez le droit à un gcc mais pas au web.
Comments