La transitivité de l'égalité pour les pointeurs, quelle que soit leur provenance, découle de la spécification des opérateurs d'égalité. C 2018 6.5.9 6 dit :
Deux pointeurs sont égaux si et seulement s'ils sont tous deux des pointeurs nuls, s'ils sont tous deux des pointeurs vers le même objet (y compris un pointeur vers un objet et un sous-objet à son début) ou la même fonction, s'ils sont tous deux des pointeurs vers un élément après le dernier élément du même tableau, ou si l'un est un pointeur vers un élément après la fin d'un tableau et l'autre est un pointeur vers le début d'un tableau différent qui suit immédiatement le premier tableau dans l'espace d'adressage.
Les pointeurs nuls et les pointeurs de fonctions ne sont pas pris en compte ici, étant donné que a == b
y b == c
s'évaluent comme vraies, elles doivent satisfaire à l'une des conditions énumérées dans la spécification, et nous avons donc ces cas :
Données a == b
.
Données b == c
.
a == c
?
a
y b
les deux pointent vers le même objet .
b
y c
pointent tous deux vers le même objet.
a
y c
Les deux indiquent le même objet. C'est pourquoi a == c
est évaluée comme étant vraie.
a
y b
pointent tous deux vers le même objet.
c
pointe sur l'avant-dernier élément d'un tableau et b
pointe vers le début d'un tableau qui le suit.
c
pointe sur l'avant-dernier élément d'un tableau et a
pointe vers le début d'un tableau qui le suit. C'est pourquoi a == c
est évaluée comme étant vraie.
a
y b
pointent tous deux vers l'avant-dernier élément du même tableau.
b
y c
pointent tous deux vers l'avant-dernier élément du même tableau.
a
y c
pointent tous deux vers l'avant-dernier élément du même tableau. C'est pourquoi a == c
est évaluée comme étant vraie.
a
pointe sur l'avant-dernier élément d'un tableau et b
pointe vers le début d'un objet de type tableau qui le suit.
b
y c
pointent tous deux vers le même objet.
a
pointe sur l'avant-dernier élément d'un tableau et c
pointe vers le début d'un objet de type tableau qui le suit. C'est pourquoi a == c
est évaluée comme étant vraie.
b
pointe sur l'avant-dernier élément d'un tableau et a
pointe vers le début d'un objet de type tableau qui le suit.
b
y c
pointent tous deux vers l'avant-dernier élément d'un tableau.
c
pointe sur l'avant-dernier élément d'un tableau et a
pointe vers le début d'un objet de type tableau qui le suit. C'est pourquoi a == c
est évaluée comme étant vraie.
Notez qu'il n'y a pas de cas où b
pointe sur un objet de la première colonne et sur l'avant-dernier élément d'un tableau de la deuxième colonne, ou vice-versa : quel que soit le type de pointeur, il doit être du même type en a == b
y b == c
.