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.
考虑这个 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.