函数参数中的预增和后增的操作顺序?

我有一些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”。

那么,你的示例代码有两点需要考虑:

  1. 函数参数的求值顺序是未指定的,所以不论是++a还是a++首先求值都是依赖于实现的。
  2. 在修改之间修改多次的值而没有序列点会导致未定义的行为。 所以,你的代码的结果是不确定的。

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

 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 

引用Kernighan&Ritchie,第2.12章:

没有指定函数参数的求值顺序,所以声明

 printf("%d %d\n", ++n, power(2, n)); /* WRONG */ 

可以用不同的编译器产生不同的结果,这取决于n在调用之前是否递增。 解决办法当然是写

 ++n; printf("%d %d\n", n, power(2, n)); 

函数调用,嵌套赋值语句以及增量和减量运算符会导致“副作用” – 某些variables作为expression式评估的副产品而改变。 在涉及副作用的任何expression式中,可以对参与expression式的variables的更新次序进行微妙的依赖关系。 声明代表了一个不幸的情况

 a[i] = i++; 

问题是下标是我还是新的旧值。 编译器可以用不同的方式来解释,并根据他们的解释产生不同的答案。 这个标准故意将大多数这样的事情留给未指定的。 在expression式中发生副作用(赋值给variables)由编译器自行决定,因为最好的顺序很大程度上依赖于机器体系结构。 (该标准确实规定了在调用函数之前对参数的所有副作用都会生效,但是这对上面的printf调用没有帮助。)道德是编写依赖于评估顺序的代码是一个不好的编程习惯任何语言。 当然,有必要知道要避免什么,但是如果你不知道如何在不同的机器上完成它们,你将不会受益于特定的实现。

一元操作符函数的评估顺序:

 #include <stdio.h> void xyz(int x, int y) { printf("x:%dy:%d ", x, y); } main() { int a; a=1; xyz(++a, a); printf("a:%d\n", a); a=1; xyz(a, a++); printf("a:%d\n", a); a=1; xyz(++a, a++); printf("a:%d\n", a); } 

会输出

 x:2 y:2 a:2 x:2 y:1 a:2 x:3 y:1 a:3 

在我的系统上。 这表示函数的第二个参数正在被首先评估。 您不应该依赖函数参数的评估顺序。 没有定义,所以在不同的系统上会有所不同。

虽然,find这个行为的一个很好的例子很好。

对于非正式算子,有前增量(++ i)和后增量(i ++)。 对于预增量,要在操作之前添加要增加的值。 例如:

 #include <iostream> using namespace std; void main() { int i = 0; cout << ++i; } 

在这种情况下,输出将是1.在任何其他操作(即“cout << ++ i”)之前,variables“i”的值增加1。

现在,如果我们在同一个函数中进行了后期增量:

 #include <iostream> using namespace std; void main() { int i = 0; cout << i++; } 

输出只能是0.这是因为增量会在操作之后发生。 但是既然你想知道如何将它们作为parameter passing,那么就是这样:

 #include <iostream> using namespace std; // Function Prototypes void PrintNumbers(int, int); void main() { int a = 0, b = 0; PrintNumbers(++a, b++); } void PrintNumbers(int a, int b) { cout << "First number: " << a << endl; cout << "Second number: " << b << endl; } 

当传入这些variables作为参数时,输出将是:

  First number: 1 Second number: 0 

我希望这有帮助!!