-3

I executed following following code.


int main(void)
{
    int c;
    c=0;
    printf("%d..%d..%d \n", c,c,c);
    c=0;
    printf("%d..%d..%d \n", c,c,c++);
    c=0;
    printf("%d..%d..%d \n", c,c++,c);
    c=0;
    printf("%d..%d..%d \n", c++,c,c);

return 0;}

I expected the output as

0..0..0

1..1..0

0..1..0

0..0..0

But the output(compiled with gcc) was

0..0..0

1..1..0

1..0..1

0..1..1

What is wrong with my expectation? In gcc ,evaluation order is from right to left. Is It?

4

1 回答 1

5

我的期望有什么问题?

未指定函数参数的评估顺序 - 由实现决定。此外,参数之间没有序列点*,因此在序列点之前再次使用修改后的参数无法给您带来可预测的结果:这是未定义的行为(感谢 Eric,提供对标准的参考)。

如果您想要一个特定的评估顺序,您需要将您的参数评估为完整的表达式(这会在每个表达式之间强制一个序列点):

int arg1 = c++;
int arg2 = c;
int arg3 = c;
// This: printf("%d..%d..%d \n", c++,c,c);
// Becomes this:
printf("%d..%d..%d \n", arg1, arg2, arg3);


*序列点是代码中某个位置的花哨名称,在该位置之后,您可以指望已应用所有先前表达式的副作用,例如递增或递减。

于 2013-07-28T11:02:01.983 回答