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

关于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,反过来也一样。

实际执行流程拆解(简化版)

  1. 主函数打印Hello world!,调用self_calling_function(0):
    • 打印Inside function :0
    • 进入while循环(i=0 <5):
      • i变成1,打印 I: 1
      • 调用self_calling_function(1)
  2. 进入self_calling_function(1):
    • 打印Inside function :1
    • 进入while循环(i=1 <5):
      • i变成2,打印 I: 2
      • 调用self_calling_function(2)
  3. 重复这个嵌套调用,直到self_calling_function(4):
    • 打印Inside function :4
    • 进入while循环(i=4 <5):
      • i变成5,打印 I: 5
      • 调用self_calling_function(5)
  4. 进入self_calling_function(5):
    • 打印Inside function :5
    • while(5<5)不成立,直接返回
  5. 回到self_calling_function(4)的while循环:
    • 此时i=5,不满足<5,循环结束,返回
  6. 回到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,循环结束,返回
  7. 回到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),返回后循环结束
  8. 以此类推,直到回到最外层的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 21:47:35