关于C++中while循环内自调用函数执行行为的疑问
C++中while循环内自调用函数的执行行为分析
嘿,我来帮你理清这个问题——核心点其实是C++函数参数的传递方式,而且其实这和Java的表现是一致的,可能你之前对Java的行为理解有偏差?先看你的代码,然后一步步拆解:
你的代码如下:
#include <iostream> using namespace std; void self_calling_function(int); void self_calling_function(int i){ cout << "Inside function :" << i ; while(i < 5){ i++; cout << " I: " << i << endl; self_calling_function(i); } }; int main() { int i = 0; cout << "Hello world!" << endl; self_calling_function(i); return 0; }
为什么你的预期和实际输出不符?
问题出在值传递上:当你调用self_calling_function(i)时,传递的是i的副本,不是原变量的引用。也就是说,每个self_calling_function调用里的i都是独立的,和调用它的外层函数里的i没有任何关系——修改内层的i不会影响外层的i,反过来也一样。
实际执行流程拆解(简化版)
- 主函数打印
Hello world!,调用self_calling_function(0):- 打印
Inside function :0 - 进入while循环(i=0 <5):
- i变成1,打印
I: 1 - 调用
self_calling_function(1)
- i变成1,打印
- 打印
- 进入
self_calling_function(1):- 打印
Inside function :1 - 进入while循环(i=1 <5):
- i变成2,打印
I: 2 - 调用
self_calling_function(2)
- i变成2,打印
- 打印
- 重复这个嵌套调用,直到
self_calling_function(4):- 打印
Inside function :4 - 进入while循环(i=4 <5):
- i变成5,打印
I: 5 - 调用
self_calling_function(5)
- i变成5,打印
- 打印
- 进入
self_calling_function(5):- 打印
Inside function :5 - while(5<5)不成立,直接返回
- 打印
- 回到
self_calling_function(4)的while循环:- 此时i=5,不满足<5,循环结束,返回
- 回到
self_calling_function(3)的while循环:- 此时i=4(之前i++到4,调用完
self_calling_function(4)返回后,i还是4) - 满足i<5,所以i++到5,打印
I: 5 - 调用
self_calling_function(5),返回后,i=5,循环结束,返回
- 此时i=4(之前i++到4,调用完
- 回到
self_calling_function(2)的while循环:- 此时i=3,满足<5,i++到4,打印
I:4,调用self_calling_function(4)(这个流程和之前的self_calling_function(4)一样,直到返回) - 返回后,i=4,满足<5,i++到5,打印
I:5,调用self_calling_function(5),返回后循环结束
- 此时i=3,满足<5,i++到4,打印
- 以此类推,直到回到最外层的
self_calling_function(0)的while循环,把i从1一步步加到5,每一步都触发嵌套调用。
你预期的行为怎么实现?
如果想让函数调用时共享同一个i的状态,需要用引用传递,把函数参数改成int& i:
void self_calling_function(int& i){ cout << "Inside function :" << i ; while(i < 5){ i++; cout << " I: " << i << endl; self_calling_function(i); } };
这样所有函数调用都操作同一个i变量,就能得到你预期的输出——因为每次修改都会影响所有作用域里的i。
补充:Java里的表现其实一样
Java里的基本类型参数也是值传递,所以如果你的Java代码逻辑和这个C代码完全一致,输出应该和C的实际输出一样,而不是你预期的样子。你之前可能误解了Java的参数传递行为哦~
内容的提问来源于stack exchange,提问作者Thinker-101
相关产品推荐
相关产品推荐

