鱼C论坛

 找回密码
 立即注册
查看: 320|回复: 4

[已解决]为什么函数内外变量的值不同

[复制链接]
发表于 2024-2-19 18:21:53 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
源码
  1. #include <stdio.h>

  2. void swap(int x, int y);
  3. void swap(int x, int y)
  4. {
  5.         int temp;
  6.        
  7.         printf("In swap, 互换前: x = %d, y = %d\n", x, y);
  8.         temp = x;
  9.         x = y;
  10.         y = temp;
  11.         printf("In swap, 互换后: x = %d, y = %d\n", x, y);
  12. }

  13. int main(void)
  14. {
  15.         int x, y;
  16.         printf("请输入两个数:");
  17.         scanf("%d %d", &x, &y);
  18.         printf("In main, 互换前: x = %d, y = %d\n", x, y);
  19.         swap(x, y);
  20.         printf("In main, 互换后: x = %d, y = %d\n", x, y);
  21.        
  22.         return 0;
  23. }
复制代码

输出
  1. 请输入两个数:55 66
  2. In main, 互换前: x = 55, y = 66
  3. In swap, 互换前: x = 55, y = 66
  4. In swap, 互换后: x = 66, y = 55
  5. In main, 互换后: x = 55, y = 66

  6. --------------------------------
  7. Process exited after 2.531 seconds with return value 0
  8. 请按任意键继续. . .
复制代码


为什么函数内外变量x, y的值不同,是类似于python中的全局变量和局部变量吗?
求帮助
最佳答案
2024-2-19 18:22:19
是的,类似于Python中的全局变量和局部变量的概念。在C语言中,函数参数是按值传递的,也就是说函数内部会创建一份参数的副本,对该副本的修改不会影响原始变量的值。

在你的代码中,当你调用`swap(x, y)`时,函数`swap`会创建两个新的变量`int x`和`int y`,并将它们的值初始化为传入的参数的值,也就是55和66。接着,函数内部的交换操作只会修改这两个新变量的值,并不会影响到`main`函数中的原始变量。

如果你想通过函数修改原始变量的值,你可以使用指针作为函数参数,通过指针来操作原始变量的地址。下面是修改后的代码:

  1. #include <stdio.h>

  2. void swap(int *x, int *y);
  3. void swap(int *x, int *y)
  4. {
  5.     int temp;

  6.     printf("In swap, 互换前: x = %d, y = %d\n", *x, *y);
  7.     temp = *x;
  8.     *x = *y;
  9.     *y = temp;
  10.     printf("In swap, 互换后: x = %d, y = %d\n", *x, *y);
  11. }

  12. int main(void)
  13. {
  14.     int x, y;
  15.     printf("请输入两个数:");
  16.     scanf("%d %d", &x, &y);
  17.     printf("In main, 互换前: x = %d, y = %d\n", x, y);
  18.     swap(&x, &y);
  19.     printf("In main, 互换后: x = %d, y = %d\n", x, y);

  20.     return 0;
  21. }
复制代码


这次我们将`swap`函数的参数类型改为指针类型,接受原始变量的地址。在函数内部,通过解引用指针来修改原始变量的值。现在运行代码将会得到期望的结果。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-2-19 18:22:19 | 显示全部楼层    本楼为最佳答案   
是的,类似于Python中的全局变量和局部变量的概念。在C语言中,函数参数是按值传递的,也就是说函数内部会创建一份参数的副本,对该副本的修改不会影响原始变量的值。

在你的代码中,当你调用`swap(x, y)`时,函数`swap`会创建两个新的变量`int x`和`int y`,并将它们的值初始化为传入的参数的值,也就是55和66。接着,函数内部的交换操作只会修改这两个新变量的值,并不会影响到`main`函数中的原始变量。

如果你想通过函数修改原始变量的值,你可以使用指针作为函数参数,通过指针来操作原始变量的地址。下面是修改后的代码:

  1. #include <stdio.h>

  2. void swap(int *x, int *y);
  3. void swap(int *x, int *y)
  4. {
  5.     int temp;

  6.     printf("In swap, 互换前: x = %d, y = %d\n", *x, *y);
  7.     temp = *x;
  8.     *x = *y;
  9.     *y = temp;
  10.     printf("In swap, 互换后: x = %d, y = %d\n", *x, *y);
  11. }

  12. int main(void)
  13. {
  14.     int x, y;
  15.     printf("请输入两个数:");
  16.     scanf("%d %d", &x, &y);
  17.     printf("In main, 互换前: x = %d, y = %d\n", x, y);
  18.     swap(&x, &y);
  19.     printf("In main, 互换后: x = %d, y = %d\n", x, y);

  20.     return 0;
  21. }
复制代码


这次我们将`swap`函数的参数类型改为指针类型,接受原始变量的地址。在函数内部,通过解引用指针来修改原始变量的值。现在运行代码将会得到期望的结果。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-2-19 18:25:07 | 显示全部楼层
FishC 发表于 2024-2-19 18:22
是的,类似于Python中的全局变量和局部变量的概念。在C语言中,函数参数是按值传递的,也就是说函数内部会 ...

C语言中就没有类似Python中的global关键字的功能吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-2-19 18:25:40 | 显示全部楼层
九歌当下 发表于 2024-02-19 18:25
C语言中就没有类似Python中的global关键字的功能吗


在C语言中,没有像Python中的`global`关键字那样的直接控制全局变量的功能。在C语言中,如果想要在函数内部修改全局变量的值,可以使用以下两种方法:

1. 使用全局变量的指针:在函数中使用全局变量的指针作为参数进行传递,并通过解引用指针来修改全局变量的值。

  1. #include <stdio.h>

  2. int globalVariable = 10;

  3. void modifyGlobalVariable(int *ptr) {
  4.     *ptr = 20;
  5. }

  6. int main() {
  7.     printf("Before modification: %d\n", globalVariable);
  8.     modifyGlobalVariable(&globalVariable);
  9.     printf("After modification: %d\n", globalVariable);

  10.     return 0;
  11. }
复制代码


输出:
  1. Before modification: 10
  2. After modification: 20
复制代码


2. 使用`extern`关键字声明全局变量:如果需要在多个源文件中共享全局变量,可以在其他源文件中使用`extern`关键字声明全局变量,从而可以在函数中访问和修改这个全局变量。

file1.c:
  1. #include <stdio.h>

  2. int globalVariable = 10;
复制代码


file2.c:
  1. #include <stdio.h>

  2. extern int globalVariable;

  3. void modifyGlobalVariable() {
  4.     globalVariable = 20;
  5. }

  6. int main() {
  7.     printf("Before modification: %d\n", globalVariable);
  8.     modifyGlobalVariable();
  9.     printf("After modification: %d\n", globalVariable);

  10.     return 0;
  11. }
复制代码


输出:
  1. Before modification: 10
  2. After modification: 20
复制代码


这两种方法都可以在函数内部修改全局变量的值,但需要注意全局变量的访问和修改要符合适当的规范,以避免不必要的错误。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-2-19 18:40:59 | 显示全部楼层
你把变量定义在函数外不就好了吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-11 01:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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