You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何不使用循环和条件打印1-100?求解释这段C代码关键部分

拆解这段无循环无条件的1-100打印代码

嘿,这个写法挺巧妙的——用递归+函数指针的组合绕开了循环和条件判断,咱们逐个解决你的疑问:

1. 为什么需要f2函数?

f2是一个空的终止函数,它的核心作用就是当递归走到终点时,用“啥也不做”的方式让递归链条停下来。当x >= 100的时候,程序会调用它,因为没有任何执行语句,递归就自然终止了,不会继续往下嵌套调用。

2. tab数组是什么?

这是一个函数指针数组,里面存储了两个函数的内存地址:tab[0]指向f1,tab[1]指向f2。它的关键作用是把“选择执行哪个函数”的逻辑,从if/else条件判断转换成了数组下标访问,这样就彻底避开了显式的条件语句。

3. foo函数里的tab[!(x < 100)](x);是什么意思?

咱们拆成两部分看:

  • !(x < 100):这是把布尔判断结果转换成整数下标。当x < 100时,x < 100为真(C语言里用1表示真),取反后得到0;当x >= 100时,x < 100为假(用0表示),取反后得到1。
  • tab[下标](x):根据上面得到的0或1,调用对应的函数:
    • 当下标是0时,调用f1(x):f1会先打印x+1(比如第一次调用foo(0),f1(0)就打印1),然后递归调用foo(x+1),继续下一个数的打印。
    • 当下标是1时,调用f2(x):空函数,递归到此结束。

整体流程快速梳理

  1. main里调用foo(0)
  2. foo(0)中!(0<100)是0,调用f1(0):打印1,然后调用foo(1)
  3. 重复这个过程,直到foo(99):!(99<100)是0,调用f1(99):打印100,然后调用foo(100)
  4. foo(100)中!(100<100)是1,调用f2(100):什么都不做,递归终止。

这样就实现了不用循环和条件,打印1到100的效果~

内容的提问来源于stack exchange,提问作者vrnvav97

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:02:38