C语言数组声明中常量10匹配语法规则的困惑求解
数组声明中常量
10的语法匹配疑问 C标准的6.7.5节声明符定义了如下语法:
declarator: pointeropt direct-declarator direct-declarator: identifier ( declarator ) direct-declarator [ type-qualifier-listopt assignment-expressionopt ] direct-declarator [ static type-qualifier-listopt assignment-expression ] direct-declarator [ type-qualifier-list static assignment-expression ] direct-declarator [ type-qualifier-listopt * ] direct-declarator ( parameter-type-list ) direct-declarator ( identifier-listopt )
我们常用int my_array[10]声明数组,其中的10看起来应该匹配direct-declarator [ type-qualifier-listopt assignment-expressionopt ]这条规则,但直接看assignment-expression的定义:
assignment-expression: conditional-expression unary-expression assignment-operator assignment-expression
似乎找不到10对应的匹配路径,问题出在哪?
解答
你遗漏了C标准语法的层级递进关系——语法规则是链式依赖的,assignment-expression的定义还关联着更底层的语法节点,并非仅给出的两条。
具体匹配链为:
10属于constant-expression(常量表达式),而constant-expression是conditional-expression的子集;conditional-expression直接匹配assignment-expression的第一条规则;- 最终
10完全符合direct-declarator [...]里的assignment-expression要求。
简化后的完整语法链是:10 → 整数常量 → constant-expression → conditional-expression → assignment-expression
也就是说,assignment-expression的第一条分支conditional-expression还能继续向下拆解,涵盖了常量、变量、各类表达式等多种情况,10作为整数常量自然包含在内。
内容的提问来源于stack exchange,提问作者Bogdan Tanasa
相关产品推荐
相关产品推荐

