一个C++程序由一系列源文件(source file),经过转化,成为可执行程序代码(或库)。源文件为文本文件,遵循C++语言标准,虽人为可读但计算机无法直接执行;转化后的可执行代码为机器语言(machine language),计算机可以直接执行但人为基本不可读。这个转化过程称为翻译(translation),本质上是将一种高级语言(面向人)翻译为低级语言(面向计算机)。学习C++主要学习的是C++语言标准,其基本概念中涉及到一系列词法元素(lexical element)和语法元素(grammer element)。
C++词法涉及的概念有:
标识符(Identifier)和关键字(Keyword)
C++声明中引入的名通过标识符表示,标识符由字母、数字、下划线组成。
部分特殊的标识符被C++标准保留作为关键字,关键字无法再提供普通标识符的功能,也不能被重定义。
字面量(Literal)
C++程序中有一种令牌(即语法单元),直接嵌入在代码中表示常量,这些称为字面量。字面量有整型、浮点型、字符、字符串、布尔、自定义等类型,其类型和值在编译期已确定。
其中字符、字符串常量中可能会涉及到无法正常输入的字符,这种情况需要使用转义序列(escape sequence)表示。
运算符(operator)与标点符号(punctuator)
运算符和标点符号可能由单字符组成(例如:+-*/),也可能由多字符组成(例如:++、--、<=>)。这些符号具有特定的语法含义和用途。
注释(Comment)
注释主要面向人的阅读,其在翻译阶段被忽略,编译器将其当成空白处理。故实际上注释不能算作词法元素,在预编译阶段和编译阶段之前,注释已被移除并替换为空格。
C++语法涉及的概念有:
声明(Declaration)
根据C++标准,C++源文件(准确说是预处理过后的文件)由一系列的声明组成。
实体(Entity)
声明可能引入实体,同时将实体与其名(name)和特性(property)关联起来。C++程序中的实体有:
- 值(value)
- 对象(object)
- 引用(reference)
- 函数(function)
- 枚举(enumerator)
- 类型(type)
- 类成员(class member)
- 模版(template)
- 模版特化(template specializations)
- 命名空间(namespace)
现代C++标准(C++11以及之后)引入新的实体:
- 包(pack):C++11
- 结构化绑定(structured binding):C++17
- 结果绑定(result binding):C++26
定义(Definition)
如果声明中完全定义了实体所需的所有特性,那么这种声明也成为定义。
关于定义存在一个非常重要的法则,单一定义规则(One Definition Rule,ODR),即程序中对于同一实体不能重复定义,除非是inline函数或对象。
函数(Function)
函数的定义由一系列语句(statement)组成,部分语句中含有表达式(expression),这些指明了程序需要执行的计算过程。
名(Name)
程序中出现的名需要与引入它的声明相关联,这个关联过程称为名称查找(name lookup)。
每个名都有其作用域(scope),作用域外,名不可用。
当名和其引用的实体出现在不同的作用域或者TU中时,这些名具有链接性(Linkage)。链接性指明了名的可见性和共享方式。
型(Type)
每个对象、引用、函数、表达式都关联一种类型(简称型)。可能为基本类型(fundamenta)、复杂类型(compound)、自定义类型(user-defined);也可能是完整类型(complete)或不完整类型(incomplete)。
变量(Variable)
声明的对象或引用,如果其不是类的非静态对象成员,则称之为变量。
