1.4a函数的形参与实参

(译者注:出于简化的目的,C++标准使用参数argument来表示实参,使用参量parameter来表示形参,以下不作区分,视情况使用)

函数的参量和参数

前面的课程中我们已经知道,被调用的函数将向调用它的函数返回一个值,称为返回值。

许多情况下,向被调用的函数传递一个值是非常有用的,以便其按照传递给它的数据工作。比如我们要写一个能够实现两个数相加的函数,那么调用这个函数的时候就需要告诉它把哪两个数相加,否则它怎们能知道加什么呢?参量与参数就是用来实现这个目的的。

参量是用来接收传递值得变量(形参),被放在函数体中函数名称后的圆括号中,多个参量使用逗号隔开。下面的例子是有不同个数参量的函数:

//该函数无参量
//无需调用函数传递任何值
void doPrint()
{
    std::cout << "In doPrint()" << std::endl;
}

// 这个函数有一个名为x的整型参量
// 调用函数将传递给它x的值
void printValue(int x)
{
    std::cout << x  << std::endl;
}

// 这个函数有名为x,y的两个整型参量
// 调用函数将传递x,y两个值给它
int add(int x, int y)
{
    return x + y;
}

参数是由调用函数传递给被调用函数的值(实参)。

printValue(6); // 6作为实参传递给函数printValue()

add(2, 3); // 2和3作为实参传递给函数add()

多个实参也使用逗号分开,实参(参数)的个数必须与形参(参量)相匹配,否则编译器会报错。

形参与实参的关系

函数被调用时,将会按照形参的名称创建相应的变量,然后每个实参的值都会被赋值给对应的形参,这个过程称为按值传递。(译者注:函数被调用时,计算机将为这些变量分配内存,调用结束时会释放这些内存,也成为创建和毁坏变量,这样的变量则称为局部变量)。例如:

//#include "stdafx.h" // Visual Studio用户无需注释掉此行
#include <iostream>

// x,y的值由调用函数传递
void printValues(int x, int y)
{
    std::cout << x << std::endl;
    std::cout << y << std::endl;
}

int main()
{
    printValues(6, 7); // 实参6,7分别传递给形参x,y

    return 0;
}

当使用实参6和7调用函数printValues()时,形参x被创建并被赋值6,形参y则被赋值7。输出结果如下:

6

7

形参与返回值的关系

通过使用形参和返回值,我们可以创建一个函数,把用户的输入作为实参传递给形参,经过若干计算后将结果以返回值的形式返回给调用函数。下面的小程序就是求两个数相加然后将结果作为返回值的例子。

//#include "stdafx.h" // 同前
#include <iostream>

// add() 有两个整型形参,返回两者之和
// x,y的值取决于调用它的函数
int add(int x, int y)
{
    return x + y;
}

// main函数无形参
int main()
{
    std::cout << add(4, 5) << std::endl; //实参4和5传递给add
    return 0;
}

函数add()被调用时,形参x被赋值4,形参y被赋值5,add()然后计算x+y的值得9,并将这个值返回给main(),9然后被发送给cout打印到屏幕上。输出为9,图示如下:求和函数

其他例子

再来看一个关于函数调用的例子:

//#include "stdafx.h" // 同前
#include <iostream>

int add(int x, int y)
{
    return x + y;
}

int multiply(int z, int w)
{
    return z * w;
}

int main()
{
    using namespace std;

    cout << add(4, 5) << endl; // add()中, x=4, y=5, 所以x+y=9
    cout << multiply(2, 3) << endl; // multiply()中, z=2, w=3, 所以z*w=6

    //也可通过表达式传递值
    cout << add(1 + 2, 3 * 4) << endl; // add()中, x=3, y=12, 所以x+y=15

    //也可通过变量传递值
    int a = 5;
    cout << add(a, a) << endl; // 计算 (5 + 5)

    cout << add(1, multiply(2, 3)) << endl; // 计算 1 + (2 * 3)
    cout << add(1, add(2, 3)) << endl; // 计算 1 + (2 + 3)

    return 0;
}

输出为:

9

6

15

10

7

6

前两个语句是直截了当的,结果一眼就能看出。第三个语句中,参数是表达式,其计算值传递给形参,1+2得3,传递给x,3*4得12,传递给y,结果为3+12即15。后面的几个不再多言,类似。我们着重看一下这个语句:

cout << add(1, multiply(2, 3)) << endl; // 计算 1 + (2 * 3)

执行函数add()时,CPU需要确定形参x,y的值是多少,x显然是1,为了得到y的值,需要计算multiply(2, 3) ,令z=2,w=3,得结果6,返回值6被赋值给add()的形参y,于是得到7。即(=>表示等价):

add(1, multiply(2, 3)) => add(1, 6) => 7

最后一个语句与此类似。

总结

参量是实现函数可重复的关键机制,因为它允许在无法提前得知输入值的情况下执行任务,那些输入值由调用函数通过实参传递给它。

小测验

  • 程序片段改错。
    void multiply(int x, int y)
    {
        return x * y;
    }
    
    int main()
    {
        std::cout << multiply(4, 5) << std::endl;
        return 0;
    }

 

  • 下面的程序片段有两个错误,请指出。
    int multiply(int x, int y)
    {
        int product = x * y;
    }
    
    int main()
    {
        std::cout << multiply(4) << std::endl;
        return 0;
    }

 

  • 下面的程序输出值为多少?
    #include <iostream>
    
    int add(int x, int y, int z)
    {
        return x + y + z;
    }
    
    int multiply(int x, int y)
    {
        return x * y;
    }
    
    int main()
    {
        std::cout << multiply(add(1, 2, 3), 4) << std::endl;
        return 0;
    }

 

  • 写一个名为doubleNumber()的函数,该函数有一个整型形参,返回值为传递给形参的值的两倍。
  • 写一个完整的程序,读取用户的输入,然后调用前面写的doubleNumber()函数,将结果打印到屏幕上。(参看3a初识cout、cin与名称空间

答案

1、multiply()返回值类型为void,意味着不能有返回值,与return x * y;不符。

2、问题一:main()函数只传递了一个值给multiply(),但multiply()需要两个参数。问题二:multiply()虽然将计算结果传递给了一个变量,但并没有返回该结果,应有int型返回值,需添加return product;

3、(1+2+3)*4=24,输出为24

4、

int doubleNumber(int x)
{
    return 2 * x;
}

5、

#include <iostream>

int doubleNumber(int x)
{
    return 2 * x;
}

int main()
{
    int x;
    std::cin >> x;
    std::cout << doubleNumber(x) << std::endl;
    return 0;
}

/*
// main()函数也可以写做
int main()
{
    int x;
    std::cin >> x;
    x = doubleNumber(x);
    std::cout << x << std::endl;
    return 0;
}
*/

 转载请参看关于博客页面相关要求。

关于 “1.4a函数的形参与实参” 的 1 个意见

评论关闭。