c中增量操作的评估顺序

Shi*_*hab -3 c operator-precedence post-increment

我执行了以下代码.


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;}
Run Code Online (Sandbox Code Playgroud)

我期望输出为

0..0..0

1..1..0

0..1..0

0..0..0

但是输出(用gcc编译)是

0..0..0

1..1..0

1..0..1

0..1..1

我的期望有什么问题?在gcc中,评估顺序是从右到左.是吗?

das*_*ght 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);
Run Code Online (Sandbox Code Playgroud)


*序列点是代码中某个位置的奇特名称,之后您可以依赖已应用的所有前面表达式的副作用,例如增量或减量.

  • 这不仅仅是未指明的评估顺序的问题.C标准未定义整个行为,而不仅仅是评估参数的顺序.Per C 2011(N1570)6.5 2:"如果对标量对象的副作用相对于同一标量对象的不同副作用或使用相同标量对象的值进行值计算未被排序,则行为未定义. " (2认同)