函数参数中的前缀增量和后缀增量的操作顺序是什么?
函数参数中的前缀增量和后缀增量的操作顺序是什么?
这个问题已经在这里有了答案:
我有一些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
有两个参数传递进来,++a
和a++
。有没有人能够解释一下操作的顺序来解释结果?
上面的代码根据使用的编译器而打印出\"3 13\"或\"2 23\"。
admin 更改状态以发布 2023年5月24日
好的,有两件事情需要考虑你的例子代码:
- 函数参数的评估顺序是未指定的,因此评估
++a
还是a++
先被评估是依赖于实现的。 - 在两次修改之间没有序列点的情况下,修改
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