考纲要求
- 掌握函数的结构:返回类型、函数名、参数列表与函数体。
- 理解函数必须先声明后使用,或在使用前完成定义。
- 掌握 return 的作用:结束函数执行并返回一个值,返回值类型要与函数声明一致。
- 能把一段重复执行的代码抽成函数,减少重复并提高可读性。
典型题型
- 给出函数定义,要求写出调用结果。
- 把给定的程序片段改写成函数形式。
- 判断函数返回值与调用处类型是否匹配。
常见错误
- 函数声明与定义的参数类型或顺序不一致,导致编译报错。
- 非 void 函数没有在所有分支返回值,调用时结果不确定。
- 在函数内修改同名局部变量,误以为会改变调用处的变量。
- 把函数定义写在调用之后又没有提前声明,编译无法通过。
深入理解
定义、声明、调用是三件事
定义给出完整的函数体,是唯一能产生代码的地方;声明只写返回类型、函数名和参数类型,结尾加分号,作用是告诉编译器「有这么个函数,参数和返回值是这样」;调用才是真正执行。
为什么需要声明?因为 C++ 要求先声明后使用。如果函数定义写在 main 后面,编译器读到调用语句时还不知道这个函数存在,就会报「未声明」。解决方法有两种:把定义挪到前面,或者在文件开头加一行声明:
int add(int a, int b); // 声明
int main() { cout << add(1, 2); }
int add(int a, int b) { return a + b; } // 定义返回值是最容易写错的地方
函数的返回类型决定了 return 后面必须给什么。声明为 int 却什么都不返回,编译器会给警告,程序的行为未定义——可能返回一个随机值,可能返回上一次的残留值。
不需要返回值的函数用 void,例如只负责打印的 void printArr(int a[], int n)。return 一旦执行,函数立刻结束,后面的语句全部跳过,这一点和 break 只跳出循环不同。另外,return a + b 的类型要能转换成声明的返回类型,例如声明 double 却返回 int 是安全的,反过来会截断。
把重复逻辑封装成函数
判断该不该抽函数的经验法则是:同一段逻辑出现两次以上,或者这段逻辑能用一个短句说清楚(例如「判断是否为质数」),就抽出来。函数名用动词开头,读代码的人不看函数体也知道在做什么。
抽函数还有一个好处:可以在函数内部直接 return 结束,这比在嵌套循环里用标志变量跳出所有层要清楚得多。四级题里常见的「找到第一个满足条件的数」,写成函数后代码往往能短一半。
自编例题
封装判断素数的函数
编写函数 isPrime(n) 判断 n 是否为素数,并在主函数中输出 2 到 50 之间的所有素数。
bool isPrime(int n) {
if (n < 2) return false;
for (int i = 2; i * i <= n; i++)
if (n % i == 0) return false;
return true;
}
int main() {
for (int i = 2; i <= 50; i++)
if (isPrime(i)) cout << i << ' ';
}函数把「判断一个整数是否为素数」封装起来,主函数只需要调用。循环条件写成 i 乘 i 小于等于 n,等价于 i 小于等于 n 的平方根,避免引入浮点运算,同时减少检查次数。n 小于 2 时直接返回 false,保证边界情况正确。函数在 main 之前定义,不需要额外声明;如果定义写在后面,就必须在前面补一行声明。
相关真题
这块内容在整条路线里的位置:GESP C++ 4 级备考路径。
READY TO START
开始练习
先做一套本级别测评,报告会指出哪些知识点需要重点补;再回到本页对照考纲要求逐条核对,把不确定的条目记下来集中练。
常见问题
函数必须先声明吗?
如果函数定义出现在调用之前,可以不单独声明;否则必须在调用前给出声明,告诉编译器函数的返回类型和参数。
函数可以有多个 return 吗?
可以。多个 return 表示不同的返回路径,执行到第一个 return 时函数立即结束,后面的语句不再执行。
void 函数怎么用?
void 表示不返回值,函数内用 return; 提前结束即可,调用处不能把它当作值参与运算。
