已知按值调用输出,咨询按名调用(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
相关产品推荐
相关产品推荐

