Trigraf (limbi C)

Versiunea actuală a paginii nu a fost încă examinată de colaboratori experimentați și poate diferi semnificativ de versiunea revizuită la 28 februarie 2021; verificările necesită 2 modificări .

Un trigraf (în familia C de limbi ) ( ing.  trigraf ) este o secvență de trei caractere, primele două dintre acestea fiind semne de întrebare (" ??"), iar al treilea indică semnificația trigrafului. Trigrafele sunt procesate de preprocesorul C/C++ .

Tabel trigraf

trigraf Simbol echivalent
??= #
??/ \
??' ^
??( [
??) ]
??! |
??< {
??> }
??- ~

Combinația a trei semne de întrebare (" ???") nu este un trigraf.

În realitate, trigrafele practic nu sunt folosite. Unii compilatori (cum ar fi gcc ) chiar emit un avertisment atunci când manipulează trigrafe.

Istorie

Motivul apariției trigrafelor este că pagina de coduri pe șapte biți ISO/IEC 646 , adoptată în 1972 și bazată pe ASCII , a atribuit poziții de caractere „ #$@[\]^`{|}~” caracterelor naționale ( litere suplimentare și simboluri valutare ). { a[i]='\n'; }De exemplu, germanii ar putea vedea codul ca ä aÄiÜ='Ön'; ü. Pentru a înlocui parantezele lipsă, au fost introduse trigrafe.

În Pascal , digrafele sunt folosite în același scop : (. .) (* *)în loc de [] {}.

Trigrafele au fost depreciate în standardul C++17 [1] [2] .

Exemple de comportament neașteptat

Următoarele sunt exemple de utilizare a trigrafului „ ??/” înlocuit cu simbolul „ \”. Caracterul " \" este un caracter de escape pentru caracterul nou linie .

// Următoarea linie va fi executată??????????????????/ a ++ ;

După înlocuirea " ??/" cu " \", codul a++;din a doua linie va fi considerat o continuare a comentariului început în prima linie.

/??/ * Un comentariu *??/ /

După înlocuirea „ ??/” cu „ \”, codul specificat va fi echivalent cu codul

/* Un comentariu */

Exemplu de program

??= include < stdio . h > /* # */ int main ( void ) ??< /* { */ charn ?? _ ( 5 ?? ); /* [ și ] */ n ?? ( 4 ?? ) = '0' - ( ?? -0 ?? ' 1 ??! 2 ); /* ~, ^ și | */ printf ( "%c??/n" , n ?? ( 4 ?? )); /* ??/ = \ */ returnează 0 ; ??>

Vezi și

Note

  1. " Se elimină trigrafele??! Arhivat 9 iulie 2018 la Wayback Machine ”, N3981, Richard Smith, 2014-05-06; [1] Arhivat pe 8 septembrie 2017 la Wayback Machine
  2. OpenNews: standard C++17 aprobat . opennet.ru Consultat la 7 septembrie 2017. Arhivat din original pe 8 septembrie 2017.