C 中 for 循环初始化中的评估顺序

Evaluation order in a for-loop initialization in C

考虑这个 C 代码段:

int a;
int b;
for (a = 0, b = a + 1; a < N; a++)
    /* Something. */

C 规范是否明确要求编译器按照它们出现的顺序在 for-initializer 中保留语句?

我特别试图避免未定义的行为,例如,如果 a 在 outer/global 范围内并且规范在这个特定领域并不严格。换句话说,我想确保上面的例子对编译器有明确的定义,而不是进入灰色区域,比如a = ++a + b++;

不是特别在for-initializer中,先计算逗号运算符(a = 0)左边的表达式,然后计算右边的(b = a + 1)。

N1256 6.5.17 逗号运算符

The left operand of a comma operator is evaluated as a void expression; there is a sequence point after its evaluation. Then the right operand is evaluated; the result has its type and value.