首页 > 代码库 > 以函数返回值做参数时,函数调用的顺序

以函数返回值做参数时,函数调用的顺序

 

 环境:vs2013

在下面的代码中

1 //类似于下面的代码
2 
3 foo(char*,char*,char*);
4 
5 char* str ="A#B#C";
6 
7 foo(strtok(str,"#"),strtok(NULL,"#"),strtok(NULL,"#")); 

预计让函数foo得到("A","B","C")的参数,程序编译的时候没问题,但是运行的时候出错,debug发现是strtok()函数指向空指针。

如果是按照从左往右的顺序,先执行strtok(str,"#"),在执行两个strtok(NULL,"#")是不会有问题的。

于是,修改代码,在foo()函数前面先获得("A","B","C")参数,然后再传给foo(),编译运行,OK。

 1 //类似于下面的代码
 2 
 3 foo(char*,char*,char*);
 4 
 5 char* str ="A#B#C";
 6 char a[10];
 7 char b[10];
 8 char c[10];
 9 strcpy(a,strtok(str,"#"));
10 strcpy(b,strtok(NULL,"#"));
11 strcpy(c,strtok(NULL,"#"));
12 
13 foo(a,b,c); 

 

突然发现,foo()函数的三个参数都是函数的返回值,出现这种情况的原因可能是运行的时候,foo()参数是从右到左运行strtok()函数。

foo(strtok(str,"#"),strtok(NULL,"#"),strtok(NULL,"#")); 

既然有猜想,当然就要测试一下来验证啦。

于是:

 1 #include <iostream>
 2 using namespace std;
 3 
 4 void foo(int a, int b, int c){
 5     cout << a << b << c << endl;
 6 }
 7 
 8 int f1(){
 9     cout << "f1 running" << endl;
10     return 1;
11 }
12 
13 int f2(){
14     cout << "f2 running" << endl;
15     return 2;
16 }
17 
18 int f3(){
19     cout << "f3 running" << endl;
20     return 3;
21 }
22 
23 
24 int main(){
25     foo(f1(),f2(),f3());
26 }

result:

可见,运行的顺序是由右往左的。
然后,C/C++语言中貌似没有规定求值的顺序,是不同的编译器自己决定怎么解释的。。。。

最后,找了一番资料,有篇帖子还是说的比较好的。http://bbs.csdn.net/topics/370153775,可以自己看看