c中增量操作的评估顺序

时间:2013-07-28 10:57:16

标签: 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;}

我希望输出为

  

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中,评估顺序是从右到左。是吗?

1 个答案:

答案 0 :(得分:5)

  

我的期望有什么问题?

未指定功能参数的评估顺序 - 由实现决定。此外,参数之间没有sequence point * ,因此在序列点之前再次使用修改后的参数无法给出可预测的结果:它是未定义的行为(thanks, Eric, for providing a reference to the standard

如果您需要特定的评估订单,则需要将参数评估为完整表达式(强制每个表达式之间的序列点):

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);

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