6.8.1 一般规定
语法
形式化语法
bnf
statement:
labeled-statement
unlabeled-statement
unlabeled-statement:
expression-statement
attribute-specifier-sequenceopt primary-block
attribute-specifier-sequenceopt jump-statement
primary-block:
compound-statement
selection-statement
iteration-statement
secondary-block:
statement1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
语义
- 语句规定了要执行的动作。除非另有说明,语句按顺序执行。可选的属性说明符序列归属于相应语句。
- 块可以是主块、次块,或者与函数定义相关联的块。块允许把一组声明和语句组合成一个语法单元。
- 如果块
B在语法上作为外层块A定义的一部分出现,那么与B相关的标识符作用域和对象生存期,不会延伸到A中位于B之外的部分。 - 对具有自动存储期的对象,其初始化器,以及块作用域普通标识符声明里的任意长度表达式和
typeof运算符,会在每次执行到该声明时按执行顺序求值;所得值按声明符出现顺序存入相应对象。没有初始化器的对象,其对象表示会变成不确定。 - 完整表达式是指:它既不是另一个表达式的一部分,也不是声明符或抽象声明符的一部分。
- 对于变长修改类型中的非常量长度表达式,还存在一个隐式完整表达式;在这个完整表达式内部,不同长度表达式之间的求值彼此不排序。
- 一个完整表达式求值结束,到下一个将要被求值的完整表达式开始求值之间,存在一个序列点。
注
下列各项都属于完整表达式:
- 变长修改类型的一个完整声明符;
- 不属于复合字面量的初始化器;
- 表达式语句中的表达式;
- 选择语句
if或switch的控制表达式; while或do语句的控制表达式;for语句中每个可选表达式;return语句中的可选表达式。
常量表达式在定义上也满足完整表达式的条件,但其求值既不依赖副作用,也不产生副作用,因此“完整表达式”带来的排序含义对常量表达式并不重要。