C++语法详解
立即解锁
发布时间: 2025-08-22 00:47:49 阅读量: 3 订阅数: 16 


C++编程语言精髓与实践
### C++语法详解
#### 1. 引言
C++语法总结旨在辅助理解,并非语言的精确表述。这里描述的语法接受有效C++构造的超集,需应用消歧规则区分表达式和声明,同时要借助访问控制、歧义性和类型规则剔除语法有效但无意义的构造。C和C++标准语法通过语法结构而非约束来表达细微差别,这虽带来了精确性,但并非总能提高可读性。
#### 2. 关键字
新的依赖上下文的关键字通过`typedef`、`namespace`、`class`、`enumeration`和`template`声明引入程序。以下是一些关键字相关的定义:
- `typedef-name`:标识符
- `namespace-name`:`original-namespace-name` 或 `namespace-alias`
- `original-namespace-name`:标识符
- `namespace-alias`:标识符
- `class-name`:标识符或 `template-id`
- `enum-name`:标识符
- `template-name`:标识符
除非标识符被显式声明为类型名,否则假定它命名的不是类型。C++的关键字如下表所示:
| 关键字 | 关键字 | 关键字 | 关键字 |
| --- | --- | --- | --- |
| `and` | `and_eq` | `asm` | `auto` |
| `bitand` | `bitor` | `bool` | `break` |
| `case` | `catch` | `char` | `class` |
| `compl` | `const` | `const_cast` | `continue` |
| `default` | `delete` | `do` | `double` |
| `dynamic_cast` | `else` | `enum` | `explicit` |
| `export` | `extern` | `false` | `float` |
| `for` | `friend` | `goto` | `if` |
| `inline` | `int` | `long` | `mutable` |
| `namespace` | `new` | `not` | `not_eq` |
| `operator` | `or` | `or_eq` | `private` |
| `protected` | `public` | `register` | `reinterpret_cast` |
| `return` | `short` | `signed` | `sizeof` |
| `static` | `static_cast` | `struct` | `switch` |
| `template` | `this` | `throw` | `true` |
| `try` | `typedef` | `typeid` | `typename` |
| `union` | `unsigned` | `using` | `virtual` |
| `void` | `volatile` | `wchar_t` | `while` |
| `xor` | `xor_eq` | | |
#### 3. 词法约定
标准C和C++语法将词法约定表示为语法产生式,这增加了精确性,但也使语法变得庞大,且并非总能提高可读性。以下是一些词法约定的定义:
- `hex-quad`:`hexadecimal-digit hexadecimal-digit hexadecimal-digit hexadecimal-digit`
- `universal-character-name`:`\u hex-quad` 或 `\U hex-quad hex-quad`
- `preprocessing-token`:`header-name`、`identifier`、`pp-number`、`character-literal`、`string-literal`、`preprocessing-op-or-punc` 或 不能属于上述类型的非空白字符
- `token`:`identifier`、`keyword`、`literal`、`operator` 或 `punctuator`
在组成词法标记时,选择最长的可能字符序列。例如,`double` 是单个标记,而不是 `do` 后跟 `uble`,`+++` 是 `++` 后跟 `+`。
#### 4. 程序
程序是通过链接组合的翻译单元的集合。翻译单元(通常称为源文件)是声明的序列:
```plaintext
translation-unit:
declaration-seqopt
```
#### 5. 表达式
表达式在相关章节有描述并在§6.2中总结。`expression-list` 的定义与 `expression` 相同。有两条规则用于区分函数参数逗号分隔符和逗号(顺序)运算符。以下是表达式相关的定义:
```plaintext
primary-expression:
literal
this
:: identifier
:: operator-function-id
:: qualified-id
( expression )
id-expression
id-expression:
unqualified-id
qualified-id
unqualified-id:
identifier
operator-function-id
conversion-function-id
~ class-name
template-id
qualified-id:
nested-name-specifier templateopt unqualified-id
nested-name-specifier:
class-or-namespace-name :: nested-name-specifieropt
class-or-namespace-name :: template nested-name-specifier
class-or-namespace-name:
class-name
namespace-name
postfix-expression:
primary-expression
postfix-expression [ expression ]
postfix-expression ( expression-listopt )
simple-type-specifier ( expression-listopt )
typename ::opt nested-name-specifier identifier ( expression-listopt )
typename ::opt nested-name-specifier templateopt template-id ( expression-listopt )
postfix-expression . templateopt ::opt id-expression
postfix-expression -> templateopt ::opt id-expression
postfix-expression . pseudo-destructor-name
postfix-expression -> pseudo-destructor-name
postfix-expression ++
postfix-expression --
dynamic_cast < type-id > ( expression )
static_cast < type-id > ( expression )
reinterpret_cast < type-id > ( expression )
const_cast < type-id > ( expression )
typeid ( expression )
typeid ( type-id )
expression-list:
assignment-expression
expression-list , assignment-expression
pseudo-destructor-name:
::opt nested-name-specifieropt type-name :: ~ type-name
::opt nested-name-specifier template template-id :: ~ type-name
::opt nested-name-specifieropt ~ type-name
unary-expression:
postfix-expression
++ cast-expression
-- cast-expression
unary-operator cast-expression
sizeof unary-expression
sizeof ( type-id )
new-expression
delete-expression
unary-operator: one of
* & + - ! ~
new-expression:
::opt new new-placementopt new-type-id new-initializeropt
::opt new new-placementopt ( type-id ) new-initializeropt
new-placement:
( expression-list )
new-type-id:
type-specifier-seq new-declaratoropt
new-declarator:
ptr-operator new-declaratoropt
direct-new-declarator
direct-new-declarator:
[ expression ]
direct-new-declarator [ constant-expression ]
new-initializer:
( expression-listopt )
delete-expression:
::opt delete cast-expression
::opt delete [ ] cast-expression
cast-expression:
unary-expression
( type-id ) cast-expression
pm-expression:
cast-expression
pm-expression .* cast-expression
pm-expression ->* cast-expression
multiplicative-expression:
pm-expression
multiplicative-expression * pm-expression
multiplicative-expression / pm-expression
multiplicative-expression % pm-expression
additive-expression:
multiplicative-expression
additive-expression + multiplicative-expression
additive-expression - multiplicative-expression
shift-expression:
additive-expression
shift-expression << additive-expression
shift-expression >> additive-expression
relational-expression:
shift-expression
relational-expression < shift-expression
relational-expression > shift-expression
relational-expression <= shift-expression
relational-expression >= shift-expression
equality-expression:
relational-expression
equality-expression == relational-expression
equality-expression != relational-expression
and-expression:
equality-expression
and-expression & equality-expression
exclusive-or-expression:
and-expression
exclusive-or-expression ^ and-expression
inclusive-or-expression:
exclusive-or-expression
inclusive-or-expression | exclusive-or-expression
logical-and-expression:
inclusive-or-expression
logical-and-expression && inclusive-or-expression
logical-or-expression:
logical-and-expression
logical-or-expression || logical-and-expression
conditional-expression:
logical-or-expression
logical-or-expression ? expression : assignment-expression
assignment-expression:
conditional-expression
logical-or-expression assignment-operator assignment-expression
throw-expression
assignment-operator: one of
= *= /= %= += -= >>= <<= &= ^= |=
expression:
assignment-expression
expression , assignment-expression
constant-expression:
conditional-expression
```
语法歧义源于函数风格强制类型转换和声明的相似性。例如:
```cpp
int x;
void f(
```
0
0
复制全文
相关推荐









