函数参数中的前缀增量和后缀增量的操作顺序是什么?

20 浏览
0 Comments

函数参数中的前缀增量和后缀增量的操作顺序是什么?

这个问题已经在这里有了答案:

为什么这些使用前缀和后缀自增的构造是未定义的行为?

我有一些C代码:

main()
{
    int a=1;
    void xyz(int,int);
    xyz(++a,a++);     //which Unary Operator is executed first, ++a or a++?
    printf("%d",a);
}
void xyz(int x,int y)
{
    printf("\n%d %d",x,y);
}

函数xyz有两个参数传递进来,++aa++。有没有人能够解释一下操作的顺序来解释结果?

上面的代码根据使用的编译器而打印出\"3 13\"或\"2 23\"。

admin 更改状态以发布 2023年5月24日
0
0 Comments

好的,有两件事情需要考虑你的例子代码:

  1. 函数参数的评估顺序是未指定的,因此评估++a还是a++先被评估是依赖于实现的。
  2. 在两次修改之间没有序列点的情况下,修改a的值超过一次将导致未定义的行为。因此,你的代码的结果是未定义的。

如果我们简化您的代码并消除未指定和未定义的行为,则我们可以回答这个问题:

void xyz(int x) { }
int a = 1;
xyz(a++); // 1 is passed to xyz, then a is incremented to be 2
int a = 1;
xyz(++a); // a is incremented to be 2, then that 2 is passed to xyz

0