Aller au contenu

Le côté obscure¤

Shadowy escape¤

Exercice 1 : Shadowy escape

Que retourne la fonction f ?

```c

include ¤

int x = 42 ; int f() { int x = 23 ; { extern int x ; return x ; } }

  • 42
  • 23
  • 0
  • 1

Exercice 2 : Curieux entier

Que vaut x

int32_t x = '0123';
  • Erreur de compilation
  • 123
  • 0x30313233
  • 4817243
  • Warning multi-character character constant

Exercice 3 : Vilains crochets

Que vaut x

char x = "hello"[4];
  • Erreur de compilation
  • 'o'
  • 'h'
  • 0

Exercice 4 : La règle gourmande

Que vaut x

int x = 0;
x = x+++x++;
  • 0
  • 1
  • 2
  • 3
Solution

L'expression x+++x++ est équivalente à x++ + x++. L'opérateur ++ est associatif à droite, donc x++ est évalué en premier, puis x++ est évalué. x est incrémenté deux fois, donc x vaut 2. On parle de greedy lexer rule. Le parseur est gourmand et prend le plus grand nombre de caractères possible pour former un jeton.

Cela ne fonctionne pas à tous les coups. L'expression x+++++y est invalide car l'opérateur ++ ne peut pas être suivi d'un autre opérateur ++. Il est nécessaire dans ce cas de séparer les opérateurs par des espaces pour que le code soit valide : x+++ ++y.

Exercice 5 : Collision globale

Qu'affiche le programme ?

a.c
int x = 42;
b.c
int x;
{
    printf("%d\n", x);
}
$ gcc a.c b.c && ./a.out
  • 42
  • 0
  • Indéfini
  • Erreur de compilation