为什么这段包含静态变量的C语言代码调用f(5)的输出结果是18?
C语言代码f(5)返回值18的推导过程
示例代码
#include <stdio.h> int f(int n) { static int r = 0; if (n <= 0) return 1; if (n > 3) { r = n; return f(n-2)+2; } return f(n-1)+r; } int main() { printf("%d", f(5)); }
核心注意点
- 函数内部用
static修饰的局部变量r仅会在第一次调用f函数时执行初始化赋值为0,后续所有调用f函数时都不会重置r的值,r的取值会在多次调用之间保留。
调用链路正向执行过程
- 首次调用
f(5):n=5>3,将r赋值为5,返回值为f(5-2) + 2即f(3) + 2 - 调用
f(3):n=3≤3,不满足n>3的条件,返回值为f(3-1) + r即f(2) + 5(此时r的取值是之前赋值的5) - 调用
f(2):n=2≤3,返回值为f(2-1) + 5即f(1) + 5 - 调用
f(1):n=1≤3,返回值为f(1-1) + 5即f(0) +5 - 调用
f(0):n=0≤0,直接返回1
返回值反向计算过程
f(0) = 1f(1) = f(0) +5 = 1+5=6f(2) = f(1) +5 =6+5=11f(3) = f(2) +5 =11+5=16f(5) = f(3) +2 =16+2=18
内容的提问来源于stack exchange,提问作者Rushi
相关产品推荐
相关产品推荐

