鱼C论坛

 找回密码
 立即注册
楼主: bgc1314159

[已解决]函数参数

[复制链接]
 楼主| 发表于 2025-11-7 21:18:49 From FishC Mobile | 显示全部楼层
FishC 发表于 2025-11-7 21:15
是的,您提供的函数 `lo` 是尾递归。

### 解释:

递归栈溢出
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-11-7 21:19:26 | 显示全部楼层
bgc1314159 发表于 2025-11-07 21:18
FishC 发表于 2025-11-7 21:15
是的,您提供的函数 ` ...


在编程中,递归栈溢出是指递归函数调用自身太多次,导致程序调用栈空间耗尽而发生的错误。让我详细解释这个问题:

### 什么是递归栈溢出?

当函数递归调用自身时,每次调用都会在调用栈上创建一个新的栈帧。如果递归深度过大,栈空间会被耗尽,导致栈溢出错误。

### 栈溢出的原因:

- 递归深度过大
- 递归没有正确的终止条件
- 栈空间有限(通常几MB)

### 示例代码(会导致栈溢出):

#include <stdio.h>

void infinite_recursion(int n) {
    printf("深度: %d\n", n);
    infinite_recursion(n + 1);  // 无限递归
}

int main() {
    infinite_recursion(1);
    return 0;
}

### 如何避免递归栈溢出:

1. **确保有正确的终止条件**:
   
   int factorial(int n) {
       if (n <= 1)  // 明确的终止条件
           return 1;
       return n * factorial(n - 1);
   }

2. **使用迭代替代递归**:
   
   int factorial_iter(int n) {
       int result = 1;
       for (int i = 1; i <= n; i++) {
           result *= i;
       }
       return result;
   }

3. **使用尾递归优化**(如果编译器支持):
   
   int factorial_tail(int n, int acc) {
       if (n <= 1)
           return acc;
       return factorial_tail(n - 1, n * acc);  // 尾递归
   }

4. **减少递归深度**或增加栈大小

### 调试技巧:
- 添加深度计数器
- 使用调试器观察栈使用情况
- 在关键点添加打印语句

递归栈溢出是常见的编程错误,通过合理设计递归终止条件和考虑替代方案可以避免。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-11-7 21:22:18 From FishC Mobile | 显示全部楼层
FishC 发表于 2025-11-7 21:19
在编程中,递归栈溢出是指递归函数调用自身太多次,导致程序调用栈空间耗尽而发生的错误。让我详细解释 ...

为啥尾递归可以避免栈溢出
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-11-7 21:23:00 | 显示全部楼层
bgc1314159 发表于 2025-11-07 21:22
FishC 发表于 2025-11-7 21:19
在编程中,递归栈溢出 ...


尾递归可以避免栈溢出,是因为编译器可以对尾递归进行优化(称为尾调用优化,TCO),将递归调用转换为迭代循环,从而减少栈空间的使用。下面详细解释:

### 尾递归的定义
尾递归是指递归调用发生在函数的最后一步,且返回值直接是递归调用的结果,没有后续计算。例如:
- 尾递归示例:
  
  int tail_recursive(int n, int acc) {
      if (n == 0) return acc;
      return tail_recursive(n - 1, acc * n); // 递归调用是最后操作
  }
  

### 为什么尾递归能避免栈溢出?
1. **尾调用优化原理**:
   - 在普通递归中,每次递归调用都会在调用栈上创建新的栈帧,保存返回地址和局部变量,导致栈深度增加。
   - 在尾递归中,由于递归调用是最后一步,且没有后续操作,编译器可以复用当前函数的栈帧(而不是创建新帧)。这意味着递归调用不会增加栈深度,从而避免栈溢出。

2. **优化效果**:
   - 经过尾调用优化后,尾递归函数等效于一个循环,只使用常量栈空间(即一个栈帧)。
   - 例如,上述尾递归函数可能被优化为:
     
     int iterative_version(int n, int acc) {
         while (n != 0) {
             acc = acc * n;
             n = n - 1;
         }
         return acc;
     }
     

### 示例对比
- 普通递归(易栈溢出):
  
  int factorial(int n) {
      if (n == 0) return 1;
      return n * factorial(n - 1); // 递归调用后还有乘法操作
  }
  
  这里,每次递归调用后都需要执行乘法,栈帧累积。

- 尾递归(可优化):
  
  int factorial_tail(int n, int acc) {
      if (n == 0) return acc;
      return factorial_tail(n - 1, acc * n); // 尾递归
  }
  
  调用时初始 acc=1,例如 factorial_tail(5, 1)。编译器可优化为循环。

### 注意事项
- 尾递归优化取决于编译器:并非所有编译器都默认启用TCO(例如,GCC在-O2优化级别下通常支持,但C标准不强制要求)。
- 在函数式编程语言(如Scheme、Haskell)中,尾递归优化是标准特性。
- 如果编译器不支持优化,尾递归仍可能栈溢出,因此在实际编程中,建议:
  - 确保递归是真正的尾递归。
  - 在性能关键代码中,手动转换为迭代循环。

总结:尾递归通过编译器优化避免栈溢出,但需注意编译器支持情况。在设计递归函数时,优先考虑尾递归形式以提高健壮性。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-11-7 21:29:32 From FishC Mobile | 显示全部楼层
FishC 发表于 2025-11-7 21:23
尾递归可以避免栈溢出,是因为编译器可以对尾递归进行优化(称为尾调用优化,TCO),将递归调用转换为 ...

相当于递归每次调用都创建一个新的栈帧,尾递归因为是最后一步操作,相当于函数调用完了,不增加了。照旧沿用当前的栈帧。是不是可以这样理解
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-11-7 21:30:06 | 显示全部楼层
bgc1314159 发表于 2025-11-07 21:29
FishC 发表于 2025-11-7 21:23
尾递归可以避免栈溢出 ...


是的,您的理解基本正确!让我详细解释一下:

### 尾递归如何避免栈溢出?
- 在普通递归中,每次递归调用都会在调用栈上创建一个新的栈帧(用于保存返回地址、参数和局部变量)。随着递归深度增加,栈帧不断累积,最终可能导致栈空间耗尽(栈溢出)。
- 在尾递归中,递归调用是函数的最后一步操作(即尾调用),且返回值直接来自递归调用(没有后续计算)。因此,编译器可以进行尾调用优化(Tail Call Optimization, TCO):
  - 优化后,编译器会复用当前函数的栈帧,而不是创建新帧。因为当前函数的所有操作已完成,不需要保留任何状态(如局部变量或返回地址)。
  - 这样,递归调用实际上变成了“跳转”到函数开头,类似于循环迭代,只使用一个栈帧,从而避免栈深度增加。

### 简单类比:
- 普通递归:就像一层层叠盘子,每个盘子代表一个栈帧,叠得太高会倒塌(栈溢出)。
- 尾递归(经优化):就像用一个盘子反复使用,不会叠高,因此安全。

### 示例代码:
- 普通递归(易栈溢出):
  
  int factorial(int n) {
      if (n == 0) return 1;
      return n * factorial(n - 1); // 递归调用后还有乘法操作,需保留栈帧
  }
  
- 尾递归(可优化):
  
  int factorial_tail(int n, int acc) {
      if (n == 0) return acc;
      return factorial_tail(n - 1, acc * n); // 尾递归:直接返回递归调用
  }
  
  调用时初始 `acc=1`,例如 `factorial_tail(5, 1)`。编译器可能将其优化为循环:
  
  int factorial_iterative(int n, int acc) {
      while (n != 0) {
          acc = acc * n;
          n = n - 1;
      }
      return acc;
  }
  

### 注意事项:
- 尾递归优化取决于编译器支持(例如,GCC在-O2优化级别下通常支持,但C标准不强制要求)。
- 如果编译器未优化,尾递归仍可能栈溢出。因此,在性能关键代码中,手动转换为迭代更可靠。

总结:您的理解正确——尾递归通过复用当前栈帧避免栈帧累积,从而防止栈溢出。但实际效果需看编译器优化。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-11-7 21:34:32 From FishC Mobile | 显示全部楼层
FishC 发表于 2025-11-7 21:30
是的,您的理解基本正确!让我详细解释一下:

### 尾递归如何避免栈溢出?

循环是否也是这样理解
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-11-7 21:35:05 | 显示全部楼层
bgc1314159 发表于 2025-11-07 21:34
FishC 发表于 2025-11-7 21:30
是的,您的理解基本正 ...


是的,您的理解很准确!循环和经过优化的尾递归在栈帧使用上有相似之处,但实现机制不同:

### 循环的栈帧使用
- 循环在同一个函数栈帧内重复执行代码块,不会创建新的栈帧
- 每次迭代只是更新变量的值,栈帧大小保持不变
- 因此循环不会因为迭代次数多而导致栈溢出

### 尾递归优化后的效果
- 经过优化的尾递归,编译器会将其转换为类似循环的行为
- 复用同一个栈帧,而不是为每次递归创建新帧
- 效果上类似于循环,只使用常量栈空间

### 对比示例
- 循环版本:
  
  int factorial_loop(int n) {
      int result = 1;
      for (int i = 1; i <= n; i++) {
          result = result * i;  // 在同一个栈帧内重复执行
      }
      return result;
  }
  
- 尾递归版本(优化后效果类似循环):
  
  int factorial_tail(int n, int acc) {
      if (n == 0) return acc;
      return factorial_tail(n - 1, acc * n);  // 优化后复用栈帧
  }
  

### 关键区别
- 循环是显式地重复执行代码块
- 尾递归优化是编译器隐式地将递归转换为循环
- 两者最终都只使用一个栈帧,避免栈溢出

所以您的理解完全正确:尾递归优化后确实相当于"沿用当前的栈帧",这与循环使用栈帧的方式类似。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-11-7 21:44:25 From FishC Mobile | 显示全部楼层
FishC 发表于 2025-11-7 21:35
是的,您的理解很准确!循环和经过优化的尾递归在栈帧使用上有相似之处,但实现机制不同:

### 循环 ...

应该是循环体中每次迭代都产生栈帧销毁栈帧,相当等于设定的地盘多大就还是多大。因为每次迭代完都销毁
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-11-7 21:44:51 | 显示全部楼层
bgc1314159 发表于 2025-11-07 21:44
FishC 发表于 2025-11-7 21:35
是的,您的理解很准确 ...


在编程中,您的理解有一个常见的误解。让我详细解释循环和栈帧的关系:

### 循环不会在每次迭代中创建和销毁栈帧
- 当函数被调用时,会在调用栈上创建一个栈帧(包含局部变量、参数等)。
- 循环(如 `for`、`while`)是在同一个函数栈帧内执行的,每次迭代只是更新变量的值,不会创建新的栈帧。
- 循环结束后,当函数返回时,整个栈帧才被销毁。
- 因此,循环只使用一个栈帧,不会因为迭代次数多而导致栈溢出。

### 对比递归
- 普通递归:每次递归调用都会创建新的栈帧,栈帧累积可能导致栈溢出。
- 尾递归优化后:编译器复用当前栈帧,类似于循环,避免栈溢出。

### 示例说明
- 循环示例:
  
  int sum_loop(int n) {
      int total = 0;
      for (int i = 1; i <= n; i++) {
          total += i;  // 每次迭代在同一个栈帧中更新变量
      }
      return total;
  }
  
  这里,无论 `n` 多大,循环只使用一个栈帧。

- 递归示例(易栈溢出):
  
  int sum_recursive(int n) {
      if (n == 0) return 0;
      return n + sum_recursive(n - 1);  // 每次递归创建新栈帧
  }
  

### 总结
循环不会“每次迭代产生和销毁栈帧”,而是复用同一个栈帧。这就像在一个固定的房间(栈帧)里反复做事情,而不像递归那样不断盖新房间(新栈帧)。因此,循环更安全,不会导致栈溢出。

如果您有更多疑问,欢迎继续讨论!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-11-7 21:48:03 From FishC Mobile | 显示全部楼层
FishC 发表于 2025-11-7 21:44
在编程中,您的理解有一个常见的误解。让我详细解释循环和栈帧的关系:

### 循环不会在每次迭代中创 ...

那为啥每次迭代循环体中变量名都销毁在重新建立
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-11-7 21:48:34 | 显示全部楼层
bgc1314159 发表于 2025-11-07 21:48
FishC 发表于 2025-11-7 21:44
在编程中,您的理解有 ...


您的观察很敏锐!让我澄清一下循环中变量的生命周期问题:

### 循环中的变量生命周期

在循环中,变量确实在每次迭代结束时"销毁",在下一次迭代开始时"重新建立",但这**不涉及栈帧的创建和销毁**,而是在**同一个栈帧内**进行的内存管理。

### 具体解释:

1. **栈帧是固定的**:
   - 当函数被调用时,会创建一个固定的栈帧
   - 循环体中的所有变量都在这个栈帧内分配内存
   - 函数返回前,这个栈帧一直存在

2. **变量的生命周期**:
   - 循环体中的局部变量在每次迭代开始时"初始化"
   - 在每次迭代结束时"销毁"(即标记为可重用)
   - 但这只是同一块内存的重复使用,不涉及栈帧的变化

3. **编译器优化**:
   - 编译器通常会在编译时为循环变量分配固定内存位置
   - 每次迭代只是重置这些内存位置的值

### 示例说明:

int loop_example(int n) {
    int sum = 0;           // 栈帧创建时分配
   
    for (int i = 0; i < n; i++) {  // i 在循环栈帧内固定位置
        int temp = i * 2;  // temp 在每次迭代使用同一内存位置
        sum += temp;
        // 迭代结束,temp "销毁"(内存位置标记为可重用)
    }
   
    return sum;            // 函数返回时栈帧销毁
}

### 与递归的对比:

- **递归**:每次调用创建新栈帧,栈深度增加
- **循环**:在同一栈帧内重复执行,栈深度不变

### 总结:

您的理解基本正确——循环确实在每次迭代中"销毁"和"重建"变量,但这只是在**固定大小的栈帧内**进行内存重用,不会增加栈深度。这与递归调用创建新栈帧有本质区别,因此循环不会导致栈溢出。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-11-7 21:55:58 From FishC Mobile | 显示全部楼层
FishC 发表于 2025-11-7 21:48
您的观察很敏锐!让我澄清一下循环中变量的生命周期问题:

### 循环中的变量生命周期

一个函数的结束才会销毁栈帧,尾递归因为是最后操作相当于已经调用完了,不保留其他变量地址。相当于销毁完又在创建同一个栈帧。相当于复用。循环体只是每次迭代销毁变量,本身空间要等到完成才销毁
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-11-7 21:56:26 | 显示全部楼层
bgc1314159 发表于 2025-11-07 21:55
FishC 发表于 2025-11-7 21:48
您的观察很敏锐!让我 ...


您对栈帧管理的理解基本正确!让我详细解释一下,以确保清晰:

### 尾递归的栈帧复用
- 在尾递归中,递归调用是函数的最后一步操作,且没有后续计算。因此,编译器可以优化(尾调用优化):在当前函数调用完成后,直接复用当前栈帧用于下一次递归调用,而不是创建新帧。这相当于“销毁”当前栈帧(但实际上复用),从而避免栈深度增加。
- 例如:

  1.   int tail_recursive(int n, int acc) {
  2.       if (n == 0) return acc;
  3.       return tail_recursive(n - 1, acc * n); // 尾递归调用
  4.   }
  5.   
复制代码

  优化后,编译器可能将其转换为循环,只使用一个栈帧。

### 循环的栈帧管理
- 循环(如 forwhile)在同一个函数栈帧内执行。每次迭代时,循环体内的局部变量可能会被“销毁”和“重新建立”(即内存位置被重用),但整个栈帧在函数结束前不会销毁。
- 例如:

  1.   void loop_example() {
  2.       for (int i = 0; i < 10; i++) {
  3.           int temp = i; // temp 在每次迭代中“销毁”和“重建”,但栈帧不变
  4.       }
  5.   }
  6.   
复制代码

  这里,栈帧在函数 loop_example 返回时才销毁。

### 关键区别
- 尾递归通过编译器优化实现栈帧复用,防止栈溢出。
- 循环天然在单一栈帧内运行,不会增加栈深度,因此更安全。

总结:您的理解正确——尾递归优化相当于复用栈帧,而循环只使用一个栈帧直到函数结束。在实际编程中,优先使用循环或尾递归(确保编译器支持优化)以避免栈溢出。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-11-7 22:21:06 From FishC Mobile | 显示全部楼层
FishC 发表于 2025-11-7 21:56
您对栈帧管理的理解基本正确!让我详细解释一下,以确保清晰:

### 尾递归的栈帧复用

int lo(int n){
if(n==0)
return 1;
return lo(n-1)+lo(n-2);
}
不算尾递归吧
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-11-7 22:21:28 | 显示全部楼层
bgc1314159 发表于 2025-11-07 22:21
FishC 发表于 2025-11-7 21:56
您对栈帧管理的理解基 ...


不,您提供的函数不是尾递归。原因在于:

在尾递归中,递归调用必须是函数的最后一步操作,且不能有后续计算。但您的函数中,递归调用 `lo(n-1)` 和 `lo(n-2)` 发生后,它们的返回值被相加(即执行了加法操作),然后才返回结果。这违反了尾递归的定义。

示例代码:


  1. int lo(int n) {
  2.     if (n == 0)
  3.         return 1;
  4.     return lo(n-1) + lo(n-2); // 递归调用后还有加法操作,不是尾递归
  5. }
复制代码


对比尾递归示例(如计算阶乘的尾递归版本):


  1. int factorial_tail(int n, int acc) {
  2.     if (n == 0) return acc;
  3.     return factorial_tail(n - 1, acc * n); // 递归调用是最后一步,无后续操作
  4. }
复制代码


总结:您的函数是普通递归,因为递归调用后还有额外计算(加法),可能导致栈溢出风险。如果希望优化,可考虑改为迭代或尾递归形式。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 7 天前 From FishC Mobile | 显示全部楼层
FishC 发表于 2025-11-7 22:21
不,您提供的函数不是尾递归。原因在于:

在尾递归中,递归调用必须是函数的最后一步操作,且不能有 ...

如果主调函数不使用return返回的值,则必须通过地址才能修改主调函数的值。如何理解这句话
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 7 天前 | 显示全部楼层
bgc1314159 发表于 2025-11-08 11:52
FishC 发表于 2025-11-7 22:21
不,您提供的函数不是 ...


在C语言中,函数参数默认是“传值调用”(pass by value),这意味着函数内部对参数的修改不会影响主调函数中的原始变量。如果函数需要修改主调函数中的变量,通常有两种方法:

1. 使用 `return` 返回值:主调函数接收返回值并赋值给变量。
2. 通过传递变量的地址(指针):函数通过指针直接修改主调函数中的变量。

您的理解正确:如果主调函数不使用 `return` 返回的值,则必须通过传递地址来修改主调函数中的值。这是因为在传值机制下,函数只能修改其局部副本,而通过指针可以间接访问和修改原始变量。

示例代码:

使用 return 返回值:

#include <stdio.h>

int increment(int x) {
    x = x + 1;
    return x; // 返回修改后的值
}

int main() {
    int a = 5;
    a = increment(a); // 主调函数使用 return 返回的值修改 a
    printf("a = %d\n", a); // 输出 6
    return 0;
}

通过地址修改:

#include <stdio.h>

void increment(int *x) {
    *x = *x + 1; // 通过指针修改主调函数中的变量
}

int main() {
    int a = 5;
    increment(&a); // 传递 a 的地址,不使用 return 返回值
    printf("a = %d\n", a); // 输出 6
    return 0;
}

总结:如果主调函数不通过 `return` 接收返回值,则必须通过传递变量地址(指针)的方式让被调函数修改主调函数中的值。这是C语言中函数参数传递的基本规则。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 7 天前 From FishC Mobile | 显示全部楼层
FishC 发表于 2025-11-8 11:52
在C语言中,函数参数默认是“传值调用”(pass by value),这意味着函数内部对参数的修改不会影响主调 ...

可以在主函数在添加个变量相互交换改变值
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 7 天前 | 显示全部楼层
bgc1314159 发表于 2025-11-08 12:07
FishC 发表于 2025-11-8 11:52
在C语言中,函数参数 ...


您提出的方法也是可行的,这是一种通过主调函数中的变量间相互赋值来间接修改值的策略。让我详细解释这种思路:

### 通过主调函数内部变量交换来修改值

这种方法不依赖于被调函数的返回值,而是在主调函数内部通过变量间的相互赋值来达到修改值的目的。

### 示例说明

假设我们有一个函数,它不能直接修改主调函数中的变量,也不使用返回值:

#include <stdio.h>

// 这个函数不修改任何外部变量,也不返回有用的值
void process_data(int x, int y, int *result1, int *result2) {
    // 函数内部处理数据,但通过指针参数返回结果
    *result1 = x + y;
    *result2 = x * y;
}

int main() {
    int a = 5, b = 3;
    int temp1, temp2;
   
    // 调用函数,通过指针参数获取结果
    process_data(a, b, &temp1, &temp2);
   
    // 在主函数内部通过变量交换来修改原始变量的值
    a = temp1;  // 将结果赋给原始变量
    b = temp2;
   
    printf("a = %d, b = %d\n", a, b); // 输出 a=8, b=15
   
    return 0;
}

### 更直接的变量交换示例

#include <stdio.h>

// 交换两个变量的值
void swap(int *x, int *y) {
    int temp = *x;
    *x = *y;
    *y = temp;
}

int main() {
    int a = 5, b = 10;
   
    printf("交换前: a=%d, b=%d\n", a, b);
   
    // 通过函数交换变量的值
    swap(&a, &b);
   
    printf("交换后: a=%d, b=%d\n", a, b); // 输出 a=10, b=5
   
    return 0;
}

### 总结

您的理解是正确的:
1. 如果被调函数不使用 `return` 返回值,又想修改主调函数中的变量,必须通过传递地址(指针)的方式。
2. 在主调函数内部,可以通过变量间的相互赋值来间接修改值,但这通常需要借助中间变量或专门的交换函数。

这种方法在需要修改多个变量或进行复杂数据交换时特别有用,因为它避免了多次函数调用的开销。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-11-15 02:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表