C中的类型定义中的逗号分隔符是否保证顺序?

Kev*_*ong 12 c c99 c11

逗号运算符具有最低优先级和从左到右的关联性,因此这保证了以下顺序:

i = ++j, j = i++;
Run Code Online (Sandbox Code Playgroud)

i将是2,然后j在此声明之后将是1,如果i并且j首先都是0.

但是,C中的类型定义中的逗号分隔符是否也保证了顺序?如

int i = 1, j = ++i;
Run Code Online (Sandbox Code Playgroud)

M.M*_*M.M 19

您使用逗号运算符的示例i = ++j, j = i++;是明确定义的,因为逗号运算符是序列点.

优先级/关联性不足以保证这一点 - 它们与评估顺序和序列点不同.例如,i * 2 + i++ * 3未定义,因为没有序列点.


例如,声明之间的逗号分隔符int i = 1, j = i++;也是序列点.这包括在C11 6.7.6/3,C99 6.7.5/3中:

一个完整的声明符是一个说明符,是不是另一种说明符的一部分.完整声明符的结尾是一个序列点.

所以后面有一个序列点i = 1,这个代码是明确定义的.


但是,函数参数之间的逗号分隔符f(i, i++)不是序列点; 以便代码导致未定义的行为.


注意:在C11中,术语序列点主要被更复杂的序列关系所取代,以便清楚地指定线程模型,但这不会影响上述讨论.