环境: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,可以自己看看
以函数返回值做参数时,函数调用的顺序,布布扣,bubuko.com
时间: 2024-10-13 04:50:13