【问题标题】:Void Function fail (?)无效功能失败(?)
【发布时间】:2013-11-25 14:03:35
【问题描述】:
#include <stdio.h>

void set_b_to_a(int, int);

int main()
{
    int a, b;
    a=1;
    b = 15;
    set_b_to_a(a, b);
    printf("%d", b);
}

void set_b_to_a(int a, int b)
{
    b=a;
}

它应该返回 b=1。但它返回 b=15!怎么了?问题是它是一个 void 函数,这意味着它不会返回任何东西吗?有人可以解释吗?谢谢。

【问题讨论】:

  • 不,void 函数没问题。您的代码肯定应该打印 1 。如果没有就很奇怪

标签: function void


【解决方案1】:

问题是参数按值传递到你的函数,所以它们的原始值被复制到函数体内的新局部变量中。可以说,函数体是一个独立的世界(实际上,它是一个作用域),并且在那个作用域中,值参数的本地副本是唯一存在的。

在这个小世界之外,即函数结束时,您会恢复原来的变量 - 因为您只将它们的 副本 发送到函数。

相比之下,通过引用传递的参数会给出你想要的行为。在 C++ 中,您可以使用以下签名来实现:

void set_b_to_a(int& a, int& b);

【讨论】:

  • +1 正确,假设它是 C++。在 C 中你需要使用指针。
  • “在这个小世界之外,即当函数结束时,你会恢复原来的变量——因为你只是将它们的副本发送给函数。”那么,如果它什么都不做,那么这个函数有什么意义呢?我的意思是变量没有变化,那么使用这个函数有什么意义呢?
  • 另一个问题!我们使用的函数不是通过引用(我们没有说 getchar(&c)!但是,我们所说的仍然是传递给函数,然后函数返回它返回的内容,我的意思是它完成了“调用参考”不使用&s,有人可以解释一下吗?
  • @user3032632 您构建的特定函数根本没有意义。它创建一些变量,更改它们的值,然后销毁它们。这没有任何意义。相反,请编写一个有用的函数。
  • @user3032632 假设我想让你把一个号码放在我能拿到的盒子里。我可以通过两种方式做到这一点。我可以通过引用将框传递给您,因此您修改框会修改我要查看的框。或者,我可以通过值将框的 location 传递给您。您不需要修改框的位置,但您可以使用该位置来修改内容。我不能做的一件事是按值将盒子本身传递给您,因为那样您就无法更改内容。
【解决方案2】:
void set_b_to_a(int a, int b)
{
    b=a;
}

这个变量被称为b这一事实没有任何意义。它是一个可以有任何名称的形式参数,并且这个函数的行为与您以这种方式声明它的行为完全相同:

void set_b_to_a(int not_a, int not_b)
{
    not_b=not_a;
}

两个变量具有相同名称这一事实不会在它们之间建立某种关系。它们是两个不相关的变量,作用域不同,改变一个变量的值不会影响另一个变量。

【讨论】:

  • 如果您知道这一点,那么为什么程序的行为会让您感到困惑?如果你意识到这两个变量是不相关的,只是巧合地同名,你为什么期望改变一个来改变另一个?
  • @user3032632 这的问题。您可以不理解它,但是在 SO 中发布的内容必须是正确的 - 这个答案是,并且您的评论不是。
猜你喜欢
  • 1970-01-01
  • 2021-12-17
  • 1970-01-01
  • 1970-01-01
  • 2015-12-02
  • 1970-01-01
  • 2021-10-05
  • 2017-12-17
  • 1970-01-01
相关资源
最近更新 更多