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

已知按值调用输出,咨询按名调用(call by name)下的程序输出

按名调用(Call by Name)下的代码输出分析

先回顾你提到的按值调用时的输出:

Here is f
main: z = 15

再看原代码:

int f() { cout << "Here is f" << endl; return 5; }
int g(int a) { int x = a; int y = 2 * a; return x + y; }
int main() { int z = g(f()); cout << "main: z = " << z << endl; }

按名调用和按值调用的核心区别在于实参的处理逻辑:按值调用会先执行f()拿到结果5,再把这个固定值传给g的形参a;但按名调用不会提前计算实参,而是把f()这个表达式直接“替换”到g函数里每一处用到a的位置,每次用到a就重新执行一遍f()。

我们一步步拆解执行流程:

  • 进入main后,执行z = g(f()),此时g的形参a不会被替换成5,而是直接关联到f()这个表达式。
  • 进入g函数,第一行int x = a; → 等价于执行int x = f();,这时候f()被调用,输出Here is f,返回5,所以x的值是5。
  • 接下来第二行int y = 2 * a; → 等价于执行int y = 2 * f();,这里又会调用一次f(),再次输出Here is f,返回5,所以y的值是2*5=10。
  • 最后g返回x+y=5+10=15,回到main后输出main: z = 15。

所以按名调用时的完整输出是:

Here is f
Here is f
main: z = 15

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:52:31