Comme déjà indiqué, il ??!??!
y a essentiellement deux trigraphes ( ??!
et ??!
encore une fois) assemblés qui sont remplacés-traduits en ||
, c'est -à -dire le OU logique , par le préprocesseur.
Le tableau suivant contenant chaque trigraphe devrait aider à lever l'ambiguïté des combinaisons de trigraphes alternatives:
Trigraph Replaces
??( [
??) ]
??< {
??> }
??/ \
??' ^
??= #
??! |
??- ~
Source: C: A Reference Manual 5th Edition
Donc, un trigraphe qui ressemble ??(??)
finira par correspondre []
, ??(??)??(??)
sera remplacé par [][]
et ainsi de suite, vous avez l'idée.
Étant donné que les trigraphes sont substitués pendant le prétraitement, vous pouvez utiliser cpp
pour obtenir vous-même une vue de la sortie, à l'aide d'un trigr.c
programme stupide :
void main(){ const char *s = "??!??!"; }
et le traiter avec:
cpp -trigraphs trigr.c
Vous obtiendrez une sortie console de
void main(){ const char *s = "||"; }
Comme vous pouvez le constater, l'option -trigraphs
doit être spécifiée, sinon cpp
un avertissement sera émis; cela indique comment les trigraphes sont une chose du passé et sans valeur moderne autre que de confondre les gens qui pourraient les croiser .
Quant à la justification de l'introduction des trigraphes, elle est mieux comprise lorsque l'on examine la section historique de l'ISO / CEI 646 :
L'ISO / CEI 646 et son prédécesseur ASCII (ANSI X3.4) ont largement approuvé les pratiques existantes concernant les codages de caractères dans l'industrie des télécommunications.
Étant donné que l'ASCII ne fournissait pas un certain nombre de caractères nécessaires pour les langues autres que l'anglais, un certain nombre de variantes nationales ont été créées pour remplacer certains caractères moins utilisés par ceux nécessaires .
(c'est moi qui souligne)
Ainsi, en substance, certains caractères nécessaires (ceux pour lesquels il existe un trigraphe) ont été remplacés dans certaines variantes nationales. Cela conduit à la représentation alternative utilisant des trigraphes composés de caractères que d'autres variantes avaient encore autour.
!ErrorHasOccurred() ??!???! HandleError();
compiler? Voilà??!
???
!
. Prouve le point?