函数参数中的预增和后增的操作顺序?
我有一些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”。
那么,你的示例代码有两点需要考虑:
- 函数参数的求值顺序是未指定的,所以不论是
++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
引用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
我希望这有帮助!!