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

环境: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

以函数返回值做参数时,函数调用的顺序的相关文章

[转]C++函数返回值为对象时,构造析构函数的执行细节

看如下代码: 复制代码代码如下: #include<iostream>class TestConstructor{public:    TestConstructor()    {        std::cout<<"TestConstructor()"<<std::endl;    }    ~TestConstructor()    {        std::cout<<"~TestConstructor()"

对象做函数参数和函数返回值时,调用复制构造函数,构造函数,析构函数的情况

// 对象做函数参数和返回值.cpp : 定义控制台应用程序的入口点.//exit(0)表示正常退出程序,exit(0)表示异常退出 //在调用input时,编译器用对象A去创建了形参对象temp,调用了复制构造函数,对象A中的数据复制给了对象temp// 在input函数中,执行temp.set(s),为对象temp中数据成员str申请了动态储存空间,并设置了输入的字符串//并没有改变实参A中的数据成员str的储存空间,故在执行语句A.show()后输出的字符串并没有改变.在函数调用结束后 /

const 小结: 做函数参数,做函数返回值,以及const函数

做函数参数 : 例如 fun(const int * i)参数i的值不能在fun()函数执行的过程中被修改,它将一直保持调用此函数时传入的值.如果试图修改i值的语句在fun()函数中出现,将导致程序无法编译,这样对参数i起到保护作用. 注:const 通常用来限制函数的指针参数,引用和数组参数,而一般形式的参数因为形参和实参本不是同一内存单元的变量,所以对形参的修改不会影响实参,因此也没有必要限制函数体不能对参数进行修改.  做函数返回值 : 函数返回值为 const 只有用在函数返回为引用的情

python开发编程基础:函数定义,返回值,参数

一,函数的定义 1,函数mylen叫做函数名 #函数名 #必须由字母下划线数字组成,不能是关键字,不能是数字开头 #函数名还是要有一定的意义能够简单说明函数的功能2,def是关键字 (define)3,():必须写4,函数体内尽量写注释,方便查看代码5,函数的调用:函数名+括号 1 #!/usr/bin/env python 2 #_*_coding:utf-8_*_ 3 4 def mylen(): #函数名 5 ''' 6 计算字符串长度的函数 这里写的是注释,方便查看代码 7 ''' 8

const修饰函数参数 const修饰函数返回值 const修饰成员函数

看到const 关键字,C++程序员首先想到的可能是const 常量.这可不是良好的条件反射.如果只知道用const 定义常量,那么相当于把火药仅用于制作鞭炮.const 更大的魅力是它可以修饰函数的参数.返回值,甚至函数的定义体. const 是constant 的缩写,"恒定不变"的意思.被const 修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性.所以很多C++程序设计书籍建议:"Use const whenever you need". 1

速战速决 (3) - PHP: 函数基础, 函数参数, 函数返回值, 可变函数, 匿名函数, 闭包函数, 回调函数

[源码下载] 作者:webabcd 介绍速战速决 之 PHP 函数基础 函数参数 函数返回值 可变函数 匿名函数 闭包函数 回调函数 示例1.函数的相关知识点 1(基础)function/function1.php <?php /** * 函数的相关知识点 1(基础) */ // 可以在相关的 function 声明语句之前调用该函数 f1(); function f1() { echo "f1"; echo "<br />"; } // 这里调用

PHP_零基础学php_3PHP函数、传参函数、默认参数、函数返回值

<?php function say_hello() //无参数 { $name="tang"; echo "hello,".$name; echo "<br />"; echo "<hr />"; } say_hello();//函数调用 function say_helloS($some_name)//有参数 { echo "hello,".$some_name; echo

逆向知识十一讲,识别函数的调用约定,函数参数,函数返回值.

逆向知识十一讲,识别函数的调用约定,函数参数,函数返回值. 在反汇编中,我们常常的会看到各种的函数调用,或者通过逆向的手段,单独的使用这个函数,那么此时,我们就需要认识一下怎么识别函数了. 一丶识别__cdecl 函数(俗称C Call),函数参数,函数返回值 首先写一个C Call的函数 1.返回值 int类型, 参数int 类型 高级代码: int __cdecl MyAdd(int a,int b) { return a + b; } int main(int argc, char* ar

Golang中interface{}作为函数参数和函数返回值的使用

package main import (     "errors"     "fmt" ) type item struct {     Name string } func (i item) String() string {     return fmt.Sprintf("item name: %v", i.Name) } type person struct {     Name string     Sex  string } func