标签:style blog class code c java
环境: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
标签:style blog class code c java
原文地址:http://www.cnblogs.com/qingsiburan/p/3725141.html