C 标准 - 逗号运算符语法

C Standard - Comma Operator Syntax

根据 C 标准(和 K&R),逗号运算符的语法如下:

expression:
    assignment-expression
    expression, assignment-expression

但是为什么这个语句有效?

5+5, 1+1; 

5+5 和 1+1 不是赋值表达式,但 C 标准要求赋值表达式作为逗号运算符的操作数。

assignment-expressionconditional-expressionlogical-OR-expressionlogical-AND-expressioninclusive-OR-expressionexclusive-OR-expressionAND-expressionequality-expressionrelational-expressionshift-expressionadditive-expression 最后是 ⊃ additive-expression + multiplicative-expression.

所以不对,5+5确实是∈assignment-expression.


⊃ 是 "contains" 关系。

C 语法的定义方式一开始可能并不明显。

首先,让我们看看assignment-expression是如何定义的:

(6.5.16) assignment-expression:
    conditional-expression
    unary-expression assignment-operator assignment-expression

这意味着它可以是或者 conditional-expression或者后者的令牌组合。前者定义为:

(6.5.15) conditional-expression:
    logical-OR-expression
    logical-OR-expression ? expression : conditional-expression

最终你会遇到:

(6.5.7) shift-expression:
    additive-expression
    shift-expression << additive-expression
    shift-expression >> additive-expression

其中 additive-expression 对应于 1+1.

等表达式