Trigraph Sequences In C Language

trigraph sequences In C Language

tirgraph sequences其实就是用特殊的三字符序列来表示某个字符,在C语言诞生的早期有的键盘(非英语国家)是没有中括号,大括号等字符输入功能的,但这些字符都是构成C语言语法必不可少的,为了解决这个问题,C标准就规定了若干三字符序列来表示这些不能录入的字符

trigraph sequences有哪些?

    Trigraph    Represent

      ??=         #

      ??/         \

      ??'         ^

      ??(         [

      ??)         ]

      ??!         |

      ??<         {

      ??>         }

      ??-         ~

值得注意的是??/,如果行尾有它作用是对换行符进行转义

trigraph sequences替换是如何发生的?

tirgraph sequences发生在预处理阶段的第一步,凡是遇到符合trigraph sequences的字符序列就进行替换,这通常是没有任何问题的,但如果程序出现的trigraph sequences是无意造成的(也就是说程序员原来以为的普通的字符串却符合了tirgraph语法),这样的替换就是bug,例如: printf("What??!");,若该代码本意是输出What??!,但是经过trigraph替换后输出的却是What|,发生意外替换可能的位置有:

1. multi-charcter constants,例如: `unsigned int c = 'B??!';`

2. string literals,例如: `printf("hello??!");`

3. comments,例如: `/* What??! */`

那么如何避免错误的替换呢?可以通过在第一个问号与第二个问号之间插入转义符\避免替换发生,还可以这样printf("What?""?!");(注:字符串连接并不发生在预处理阶段)

digraph sequences是什么?

在C99标准中为上面的某些trigraph sequences提供了简化版,即使用两个字符来表示特殊字符

    Digraph     Represent

      <:          [

      :>          ]

      <%          {

      %>          }

      %:          #

**注:**digraph的替换虽然也发生在预处理阶段,但其发生于tirgraph替换之后的tokenization阶段,同时处于引号中中的digraph并不会被替换

C++增添了什么?

    Token   Represent

     %:%:    ##

     and     &&

     bitor   |

     or      ||

     xor     ^

     compl   ~

     bitand  &

     and_eq  &=

     or_eq   &=

     xor_eq  ^=

     not     !

     not_eq  !=

C++增加的替换同样是发生在预处理的tokenization阶段(详见

Xiao Wenbin
Xiao Wenbin
Natural Language Processing Engineer

My research interests include machine learning, information retrieval and natural language processing.

Related