需要澄清C语言标记的定义

4

从K&R的《C程序设计语言》书中得知:

有六类记号: 标识符、关键字、常量、字符串字面值、运算符和其他分隔符。空格、水平和垂直制表符、换行符、进纸符以及下面所述的注释(统称为“空格”)都被忽略,除非它们分隔记号。

“其他分隔符”是什么意思?

假设给出一个语句:

result = (4 * b - a * b) / 3;

因此,根据定义,resultab应该是标识符,=()*/-应该是运算符。那么分号;呢?它是否被视为记号,如果是,它属于什么类别?
另外,对于空格,它们是否被视为“其他分隔符”?

2
除了空格之外,C语言中的其他分隔符包括,:;. - TheCodeArtist
3个回答

3
什么是分隔符?
可以用来分隔标记的任何内容。例如,在代码中使用,作为分隔符。

int a, b, c;

一个操作符也可以作为分隔符。
a = b*c;

* 是一个算术运算符,同时也是一个分隔符。它将在标记化过程中分隔两个标识符 bc

那么分号 ; 呢?它是否被视为一个标记,如果是的话,它属于哪个类别?

; 也是一个分隔符。它将一个语句与另一个语句分开,并因此形成标记。


3
这种运算符和其他分隔符的区别在早期版本的C语言中存在,但已被删除。
C89标准提供了以下运算符和标点符号列表(标点符号是K&R所称的“其他分隔符”):
operator: one of
        [  ]  (  )  .  ->
        ++  --  &  *  +  -  ~  !  sizeof
        /  %  <<  >>  <  >  <=  >=  ==  !=  ^  |  &&  ||
        ?  :
        =  *=  /=  %=  +=  -=  <<=  >>=  &=  ^=  |=
        ,  #  ##

punctuator: one of
        [  ]  (  )  {  }  *  ,  :  =  ;  ...  #

运算符被定义为指定要执行的操作的一种东西,而标点符号具有语法意义,但不指定产生值的操作。

请注意,( ) [ ] 在表达式中使用时被认为是运算符,而在函数或数组声明中使用时被认为是标点符号。

C99标准取消了这种不必要的区分,并将所有这些符号称为“标点符号”。

关于空格,它不被视为令牌,因此不是运算符或标点符号。


1

那本书已经过时了。现在的C标准使用不同的术语和组。C11附录A.1.1:

(6.4) token:
  keyword
  identifier
  constant
  string-literal
  punctuator

有关上述内容的详细信息请参见第6.4章。不过,如果您继续阅读同一(稍微有趣的)附录,您会看到这个:

A.1.7 Punctuators
(6.4.6) punctuator: one of
  [ ] ( ) { } . ->
  ++ -- & * + - ~ !
  / % << >> < > <= >= == != ^ | && ||
  ? : ; ...
  = *= /= %= += -= <<= >>= &= ^= |=
  , # ##
  <: :> <% %> %: %:%:

如果你对这些东西感兴趣(即使对于一名资深的 C 程序员来说,它们也远非必要的知识,除非你正在制作编译器),我建议你下载标准的草案版本并阅读附录 A。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接