1.4a函数的形参与实参
2016-08-20 10:20
183 查看
(译者注:出于简化的目的,C++标准使用参数argument来表示实参,使用参量parameter来表示形参,以下不作区分,视情况使用)
前面的课程中我们已经知道,被调用的函数将向调用它的函数返回一个值,称为返回值。
许多情况下,向被调用的函数传递一个值是非常有用的,以便其按照传递给它的数据工作。比如我们要写一个能够实现两个数相加的函数,那么调用这个函数的时候就需要告诉它把哪两个数相加,否则它怎们能知道加什么呢?参量与参数就是用来实现这个目的的。
参量是用来接收传递值得变量(形参),被放在函数体中函数名称后的圆括号中,多个参量使用逗号隔开。下面的例子是有不同个数参量的函数:
参数是由调用函数传递给被调用函数的值(实参)。
多个实参也使用逗号分开,实参(参数)的个数必须与形参(参量)相匹配,否则编译器会报错。
函数被调用时,将会按照形参的名称创建相应的变量,然后每个实参的值都会被赋值给对应的形参,这个过程称为按值传递。(译者注:函数被调用时,计算机将为这些变量分配内存,调用结束时会释放这些内存,也成为创建和毁坏变量,这样的变量则称为局部变量)。例如:
当使用实参6和7调用函数printValues()时,形参x被创建并被赋值6,形参y则被赋值7。输出结果如下:
通过使用形参和返回值,我们可以创建一个函数,把用户的输入作为实参传递给形参,经过若干计算后将结果以返回值的形式返回给调用函数。下面的小程序就是求两个数相加然后将结果作为返回值的例子。
函数add()被调用时,形参x被赋值4,形参y被赋值5,add()然后计算x+y的值得9,并将这个值返回给main(),9然后被发送给cout打印到屏幕上。输出为9,图示如下:
再来看一个关于函数调用的例子:
输出为:
前两个语句是直截了当的,结果一眼就能看出。第三个语句中,参数是表达式,其计算值传递给形参,1+2得3,传递给x,3*4得12,传递给y,结果为3+12即15。后面的几个不再多言,类似。我们着重看一下这个语句:
执行函数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
最后一个语句与此类似。
参量是实现函数可重复的关键机制,因为它允许在无法提前得知输入值的情况下执行任务,那些输入值由调用函数通过实参传递给它。
程序片段改错。
下面的程序片段有两个错误,请指出。
下面的程序输出值为多少?
写一个名为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、
5、
转载请参看关于博客页面相关要求。
函数的参量和参数
前面的课程中我们已经知道,被调用的函数将向调用它的函数返回一个值,称为返回值。许多情况下,向被调用的函数传递一个值是非常有用的,以便其按照传递给它的数据工作。比如我们要写一个能够实现两个数相加的函数,那么调用这个函数的时候就需要告诉它把哪两个数相加,否则它怎们能知道加什么呢?参量与参数就是用来实现这个目的的。
参量是用来接收传递值得变量(形参),被放在函数体中函数名称后的圆括号中,多个参量使用逗号隔开。下面的例子是有不同个数参量的函数:
//该函数无参量 //无需调用函数传递任何值 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; } */
转载请参看关于博客页面相关要求。
相关文章推荐
- php中函数的形参与实参的问题说明
- h5 哥德巴赫猜想验证、函数和数组、函数的调用、形参与实参、参数的传递
- 函数的形参与实参
- 学点 C 语言(33): 函数 - 传值与传址、形参与实参
- (9)js函数形参与实参的个数可以不同
- 函数的形参与实参的关系
- 函数的定义方式 及 函数的形参与实参
- 函数的形参与实参
- python入门基础教程08 函数的形参与实参
- 函数_调用指针交换函数(形参与实参)
- 指针-形参与实参-函数传参
- 函数的形参与实参间的数据传递
- 用数组名作函数参数,此时形参与实参都用数组名
- C语言----函数的形参与实参
- php中函数的形参与实参的问题说明
- C++ 函数形参与实参总结
- JS与PHP在函数传参方面有点不同,PHP形参与实参个数要匹配,而JS就灵活多了,可以随意传参,实参比形参少或多都不会报错
- python入门基础教程08 函数的形参与实参
- Qt qDateTime头文件中min()函数缺少实参问题解决
- 形参与实参的区别