GESP C++ 4 级 · 知识点

函数的定义与调用

GESP C++ 四级要求掌握函数的定义、声明与调用,能把重复逻辑封装成函数并正确返回结果。函数题的常见错误集中在返回值、声明顺序和参数类型这三处。

对应知识域:函数的定义与调用相关真题 4 套

本页为本站原创整理,例题与解析均由本站编写,不取自任何题库原题;考试范围以 CCF 官方公布为准,本平台不是 GESP 官方平台。

考纲要求

  • 掌握函数的结构:返回类型、函数名、参数列表与函数体。
  • 理解函数必须先声明后使用,或在使用前完成定义。
  • 掌握 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; 提前结束即可,调用处不能把它当作值参与运算。

本级别其他知识点

官方依据