Come già detto ??!??!
è essenzialmente due trigrammi ( ??!
e ??!
nuovamente) mushed insieme che vengono sostituiti-tradotto a ||
, cioè la logica OR , dal preprocessore.
La seguente tabella contenente ogni trigraph dovrebbe aiutare a chiarire le combinazioni di trigraph alternative:
Trigraph Replaces
??( [
??) ]
??< {
??> }
??/ \
??' ^
??= #
??! |
??- ~
Fonte: C: A Manuale di riferimento 5a edizione
Quindi una trigrafia che sembra ??(??)
alla fine verrà mappata []
, ??(??)??(??)
verrà sostituita da [][]
e così via, avrai l'idea.
Dato che le trigrafi vengono sostituite durante la preelaborazione, è possibile utilizzare cpp
per ottenere una visione dell'output da soli, utilizzando un trigr.c
programma stupido :
void main(){ const char *s = "??!??!"; }
ed elaborandolo con:
cpp -trigraphs trigr.c
Otterrai un output della console di
void main(){ const char *s = "||"; }
Come puoi notare, l'opzione -trigraphs
deve essere specificata altrimenti cpp
emetterà un avviso; questo indica come le trigrafi appartengano al passato e non abbiano alcun valore moderno se non confondere le persone che potrebbero imbattersi in esse .
Per quanto riguarda la logica alla base dell'introduzione delle trigrafi, si comprende meglio se si guarda alla sezione della storia di ISO / IEC 646 :
ISO / IEC 646 e il suo predecessore ASCII (ANSI X3.4) hanno ampiamente appoggiato la prassi esistente in materia di codifica dei caratteri nel settore delle telecomunicazioni.
Poiché ASCII non ha fornito un numero di caratteri necessari per lingue diverse dall'inglese, sono state create numerose varianti nazionali che hanno sostituito alcuni caratteri meno utilizzati con quelli necessari .
(enfatizzare il mio)
Quindi, in sostanza, alcuni caratteri necessari (quelli per i quali esiste una trigrafia) sono stati sostituiti in alcune varianti nazionali. Questo porta alla rappresentazione alternativa usando trigrafi costituiti da personaggi che ancora esistevano altre varianti.
!ErrorHasOccurred() ??!???! HandleError();
di compilare? Ecco??!
???
!
. Dimostra il punto?