if( n == 1 ) f = 10; else
f = age( n-1 ) + 2; return f; } int main() {
cout << \ } 【解答】 age:18 8.
#include
return a + b; }
int f2( int a, int b ) {
return a - b; }
int f3( int(?t )( int, int ), int a, int b ) {
return (?t )( a, b ); } int main() {
int (?p )( int, int ); p = f1;
cout << f3( p, 4, 8 ) << endl; p = f2;
cout << f3( p, 8, 4 ) << endl; } 【解答】 12 4 9.
#include
int m = 1, n = 2, f;
f = sub( m, n );
cout << a << '\\t' << f << endl; f = sub( m, n );
cout << a << '\\t' << f << endl; }
int sub( int c, int d ) {
static int m = 2, n = 5;
cout << m << '\\t' << n << '\\t' << endl; a = ++ a; c = m ++; d = n ++; return c + d; } 【解答】
2 2 3 3
5 7 6 9
3.3 思考题
1.函数的作用是什么?如何定义函数?什么是函数原型? 【解答】
函数的两个重要作用:
(1)任务划分,把一个复杂任务划分为若干小任务,便于分工处理和验证程序正确性;(2)软件重用,把一些功能相同或相近的程序段,独立编写成函数,让应用程序随时调用,而不需要编写雷同的代码。
函数的定义形式:
类型 函数名 ( [ 形式参数表 ] ) {
语句序列
}
函数原型是函数声明,告诉编译器函数的接口信息:函数名、返回数据类型、接收的参数个数、参数类型和参数顺序,编译器根据函数原型检查函数调用的正确性。
2.什么是函数值的返回类型?什么是函数的类型?如何通过指向函数的指针调用一个已经定义的函数?编写一个验证程序进行说明。
【解答】
(1)函数的返回类型是函数返回的表达式的值得类型;
(2)函数类型是指函数的接口,包括函数的参数定义和返回类型; (3)若有 或
functionType functionName; //functionType是已经定义的函数类型 functionType *functionPointer=functionName; (*functionPointer)(argumentList); functionPointer(argumentList);
//定义函数指针并获取函数地址
则可以通过函数指针调用函数:
其中argumentList是实际参数表。
验证程序:
#include
typedef int myfunc(int,int); myfunc f,*fp; int a=10,b=6; fp=f;
cout<<\
//函数名调用函数 //函数指针调用函数 //函数指针调用函数
cout<<\ return 0; }
int f(int i,int j) { return i*j; }
3. 什么是形式参数?什么是实际参数?C++函数参数有什么不同的传递方式?编写一个验证程序进行说明。
【解答】
参数是调用函数与被调用函数之间交换数据的通道。函数定义首部的参数称为形式参数,调用函数时使用的参数称为实际参数。C++有三种参数传递机制:值传递(值调用);指针传递(地址调用);引用传递(引用调用)。
验证程序:
#include
funcA(a);cout<<\ funcB(&a);cout<<\ funcC(a);cout<<\} 程序输出:
a=1 a=21 a=51
//传值参数,实际参数值不变
//指针参数,形式参数通过间址修改实际参数 //引用参数,形式参数通过别名方式修改实际参数
cout<<\
4.C++函数通过什么方式传递返回值?当一个函数返回指针类型时,对返回表达式有什么要求?当返回引用类型时,是否可以返回一个算术表达式?为什么?
【解答】
C++首先计算表达式的值,然后把该值赋给函数返回类型的匿名对象,通过这个对象,把数值带回调用点,继续执行后续代码。
当函数返回指针类型时,返回的地址值所指对象不能是局部变量。因为局部变量在函数运行结束后会被销毁,返回这个指针是毫无意义的。
返回引用的对象不能是局部变量,也不能返回表达式。算术表达式的值被储存在匿名空间中,函数运行结束后会被销毁,返回这个变量的引用也是无意义的。
5.变量的生存期和变量作用域有什么区别?请举例说明。 【解答】
变量的生存期是指程序运行后,变量占有内存的时间;变量作用域指的是指变量声明之后,在程序正文中有效的那部分区域。
例如,定义函数:
void count() {
static int n=0; //…… }
该函数中n被定义为static变量,生存期是整个程序运行时期;但作用域只在count函数中。 6.静态局部变量有什么特点?编写一个应用程序,说明静态局部变量的作用。 【解答】
静态局部变量的生存期是全程的,作用域是局部的。程序开始执行时就分配和初始化存储空间(默认初始化值为0)。定义静态局部变量的函数退出时,系统保持其存储空间和数值。下次调用这个函数时,static变量还是上次退出函数时的值。直至整个程序运行结束,系统才收回存储空间。
程序略。
7.在一个语句块中能否访问一个外层的同名局部变量?能否访问一个同名的全局变量? 如果可以,应该如何访问?编写一个验证程序进行说明。
【解答】
一个语句块中不能访问外层的同名局部变量。可以访问一个同名的全局变量。 验证程序:
#include
int a=1; {
int a=2; }
cout<<\}
8.有函数原型
//输出外层局部变量a
cout<<\输出全局部变量a
//内层局部变量a
//输出内层局部变量a
cout<<\
//外层局部变量a
//全局变量a
void f (int & n);
和函数调用
int a; //…
f(a);
有人说,因为n是a的引用,则在函数f中访问n相当于访问a,所以,可以在f的函数体内直接使用变量名a。这种说法正确吗?为什么?编写一个验证程序。
【解答】
形式参数n的作用域是f函数,实际参数a的作用域是调用f函数的模块(例如main函数),所以在f函数中可见n而不可见a。因此,这种说法不正确。f函数内不能直接使用变量名a,只能通过别名n访问a。
验证程序:
#include
int a = 1 ; f( a );
cout<<\}
void f ( int&n ) {
a++; n++; }
产生编译错误:error C2065: ―a‖: 未声明的标识符 9.有以下程序:
#include
int a=1; else
int a=0;
cout<<\
}
编译错误为:error C2065: 'a' : undeclared identifier,指示语句行 cout<<\
变量a没有定义。请分析原因,并进行修改。
【解答】
//错误,直接使用a //正确