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

Does comma separators in type definition in C guarantee the order?

逗号运算符具有最低的优先级和从左到右的结合性,所以这保证了这样的顺序:

i = ++j, j = i++;
如果ij一开始都是0,

i会是2,然后j会是1。

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

int i = 1, j = ++i;

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

Precedence/associativity 不足以保证这一点——它们不同于求值顺序和序列点。例如,i * 2 + i++ * 3 未定义,因为没有序列点。


声明符之间的逗号分隔符,例如int i = 1, j = i++;,也是一个序列点。 C11 6.7.6/3, C99 6.7.5/3:

A full declarator is a declarator that is not part of another declarator. The end of a full declarator is a sequence point.

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


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


注:在C11中,术语序列点大部分被替换为更复杂的序列关系,以便明确指定线程模型,但这并不影响上述讨论。

假设 C 在这方面与 C# 的工作方式相同,逗号分隔值 (int i = 0, j = 0;) 应该保持顺序。

i++ 与 ++i 的区别在于验证时间:

int i = 0;

bool iGTZ = i++ > 0;//false

i = 0; iGTZ = ++i > 0;//true

比你问的多一点,但保证申报顺序。如果您或阅读本文的人不知道,希望它有所帮助。 :)

是的,这就是原因。想想逗号在说什么。它只是在说“嘿,我在这个逗号的左边有一件我想做的事情,一旦你做了那件事,就去右边的事情也做那件事。你也可以把它想象成更短的方法

int i = 1;
int j = i++;

i 已经被分配到内存中的某处,所以 j 所发生的一切就是获取存储在 i 中的值,递增它,并将它设置为等于 j。

所以在

的情况下
int i = 1, j = ++i;

你所说的只是创建一个整数,将其设置为 1,现在转到下一个命令,它将是一个名为 j 的整数,并在它递增时将其设置为等于 i。

因此,为了完整回答您的问题,是的,它保证了顺序,因为编译器将自上而下、从左到右执行所有内容,除非另有说明。