1.3.4 C++语言的词法
前面说过,一种语言包括语法、语义和语用三个方面,这里需要进一步说明的是,语言的语法又包括词法与句法。词法是指语言的构词规则,句法是指由词构成句子(程序)的规则。下面首先介绍C++的词法,C++的句法将在后面章节中用到的时候再介绍。
1.字符集
任何一种语言都是由一些基本符号构成的,这些基本符号的集合就构成了相应语言的字符集(symbol set)。C++的字符集由52个大小写英文字母、10个数字以及一些特殊符号构成。
•大小写英文字母包括a~z、A~Z。
•数字包括0~9。
•特殊字符包括!、#、%、^、&、*、_、-、+、=、~、<、>、/、\、|、.、,、:、;、?、'、"、(、)、[、]、{、}、空格、横向制表符、纵向制表符、换页符、换行符。
2.单词及词法规则
单词(word或token)是由字符集中的字符按照一定规则构成的具有一定意义的最小语法单位。C++中的单词包括标识符、关键词、字面常量、操作符以及标点符号等。
(1)标识符
标识符(identifier)是由大小写英文字母、数字以及下划线(_)所构成的字符序列,第一个字符不能是数字,如student、student_name、x_1、_name1等都是合法的标识符。
标识符通常用作程序实体的名字,程序实体包括常量、变量、函数、对象、类型(包括类)、标号等。在使用标识符时应注意以下几点:
•大小写字母是有区别的,如abc、Abc与ABC是不同的标识符。
•关键词不能作为用户自定义的标识符,它们有特殊的作用。
•C++的具体实现(编译程序)可能会限制标识符的长度。
•以两个下划线开头或以一个下划线后跟一个大写字母开头的标识符往往在C++语言内部实现中使用(如作为标准库中的全局实体的名字),程序中尽量不要用这种标识符作为自定义的实体的名字。
•不同种类的程序实体最好采用不同风格的标识符,以提高程序的易读性。
关于标识符的风格,不同的编程人员会有不同的命名习惯。下面是本教程所采用的标识符风格:
•对于符号常量,采用全部大写的标识符,如圆周率PI。
•对于自定义的类型,采用英文单词的第一个字母大写的标识符,如StudentType。
•对于变量、对象和函数,采用小写字母和下划线的标识符,如student、print、square_root。
(2)关键词
关键词(keyword)是指语言预定义的标识符,它们有固定的含义和作用,在程序中不能用作自定义实体的名字。表1-3列出了C++中的部分关键词。
表1-3 C++中的部分关键词
除了表1-3列出的关键词外,每个C++的实现可能还规定了一些额外的关键词,在使用C++时必须参考相应的语言实现参考手册。
(3)字面常量
字面常量(literal)或称直接量,是指在程序中直接写出来的常量值,如128、3.14、'A'(字符)、“abcd”(字符串)等。
(4)操作符
操作符(operator)用于描述对数据的基本操作。由于大部分操作符是对数据进行运算,因此又把操作符称为运算符,如+、-、*、/、=、>、<、==、!=、>=、<=、||、&&等。
(5)标点符号
标点符号(punctuation)起到某些语法、语义上的作用,如逗号、分号、冒号、括号等。
在C++程序的书写上,上述单词有时需要用空白符(white-space character)把它们分开,使得它们在形式上成为独立的单位。这里的空白符是指空格符、制表符、回车符和注释,其中,注释(comment)是为了方便对程序的理解而在源程序中添加的说明性文字信息。C++提供了两种书写注释的方法:
•单行注释:从符号“//”开始到本行结束。
•多行注释:从符号“/*”开始到符号“*/”结束。
需要注意的是,注释是为了人们理解程序添加的,它们不是可执行程序的一部分,编译程序在编译时将忽略程序的注释部分(多行注释被看成一个空格)。
另外,一个单词如果在一行中写不完(如一个很长的字符串),则可以把它分几行来写,这时,需要在每一行(最后一行除外)的后面加上一个续行符(continuation character)。续行符由一个反斜杠(\)后面紧跟一个回车构成。
3.语法的形式描述
在有些情况下,需要对语言的语法规则进行没有歧义的精确描述,如语言标准的定义文本等。对一种语言的语法进行精确的描述往往需要采用另一种语法和语义比较简单的语言来完成,相对于被描述的语言而言,该语言称为元语言(meta language)。较常用的用于描述程序设计语言语法规则的元语言是一种称为BNF(Backus Normal Form或Backus-Naur Form)的描述语言。例如,C++标识符的构成规则可用BNF描述成:
其中,“::=”和“|”称为元语言符号,“::=”表示“定义为”,“|”表示“或者”,它们不属于被描述的语言。“<标识符>”“<非数字字符>”以及“<数字字符>”称为元语言变量,它们代表被描述语言中的语法实体。另外,BNF也存在一些扩充形式,例如,在一些扩充的BNF中增加了方括号“[]”用于表示其中的内容可有可无,花括号“{}”用于表示其中的内容可以重复出现多次,等等。当元语言与被描述的语言有相同的符号时,应采用某种方式把它们区分开来,本教程后面将使用斜体字符来表示元语言中的符号。
由于本教程不是C++的语言定义文本,并且用BNF精确描述的内容有时理解起来比较费劲,因此,本教程中没有采用严格的形式化方法来描述所用到的C++语言成分的语法,而是采用了一种容易理解的混合形式(如简化的BNF形式加上自然语言)来对C++的语法进行描述。