规范
每个步骤结尾的 规范 一节都会对这个步骤中的新特性给出规范,方便大家查阅。
step11 语法规范
灰色部分表示相对上一节的修改。
program : (function | declaration)* function : type Identifier '(' parameter_list ')' ( compound_statement | ; ) type : 'int' parameter_list : (type Identifier (',' type Identifier)*)? compound_statement : '{' block_item* '}' block_item : statement | declaration statement : 'return' expression ';' | expression? ';' | 'if' '(' expression ')' statement ('else' statement)? | compound_statement | 'for' '(' expression? ';' expression? ';' expression? ')' statement | 'for' '(' declaration expression? ';' expression? ')' statement | 'while' '(' expression ')' statement | 'break' ';' | 'continue' ';' declaration
: type Identifier ('[' Integer ']')* ('=' expression)? ';'expression_list : (expression (',' expression)*)? expression : assignment assignment : conditional| unary '=' expressionconditional : logical_or | logical_or '?' expression ':' conditional logical_or : logical_and | logical_or '||' logical_and logical_and : equality | logical_and '&&' equality equality : relational | equality ('=='|'!=') relational relational : additive | relational ('<'|'>'|'<='|'>=') additive additive : multiplicative | additive ('+'|'-') multiplicative multiplicative : unary | multiplicative ('*'|'/'|'%') unary unary : postfix | ('-'|'~'|'!') unary postfix : primary | Identifier '(' expression_list ')'| postfix '[' expression ']'primary : Integer | '(' expression ')' | Identifier
step11 语义规范
11.1 一个数组类型描述了一组被连续分配在一段内存空间中的对象,所有对象都具有相同的类型(我们称之为元素类型)。数组类型包含两部分:元素类型,和数组的长度(即元素数量)。数组类型的表达式仅能参与下标运算。
11.2 我们仅要求支持固定长度的数组,即在数组的声明中,其长度是一个正整数字面量。
所以,我们不要求支持变长数组
int a[n];
或不定长数组int a[];
。
11.3 对于下标运算 a[b]
,要求 a
是一个数组类型,b
是一个整数类型,a[b]
是 a
中的第 b
个元素(从 0 开始计数)。
11.4 下标运算越界是未定义行为。
即便是类似
int a[4][5]; a[1][7]
这种,同样也是未定义行为。