在C中通过引用传递:结果变量如何初始化?

时间:2012-09-08 02:13:43

标签: c pass-by-reference

我是C的新手,我必须制作一个迷你计算器程序(这是作业,但我不是在寻找答案,只是多了解一点)。基本上,一个函数必须如下所示:

int add(double d, double dd, double *result);

如果没有错误,它将返回0;如果发生错误,则返回-1(在添加的情况下,不会有很多错误 - 但是除法例如,除以0将是错误)。

用户必须在终端中输入两个数字,然后将这些数字用作add方法中的参数值。我不明白的是,调用该方法时最初的结果是什么?它只是空吗?为什么我要返回0或-1而不是结果呢?例如:

double result;
returnValue = add(2.0, 5.0, &result); 

显然我会得到7作为结果,但是如何在不返回结果的情况下将其打印出来? returnValue为0,所以我知道没有错误,所以现在我需要打印结果。

3 个答案:

答案 0 :(得分:7)

C没有通过引用传递。你可以传入一个指针,这是你在这里做的,但C只有值传递。

现在问你的实际问题:

  

我不明白的是调用该方法时最初的结果是什么?它只是空吗?

不,在调用result函数之前,add的值未定义。如果您在分配之前尝试使用result的值,则无法保证,或者通过在声明它的函数中指定它或在{{1中指定它使用add等代码。

就此而言,双重永远不会是*result = d + dd。 Null是可能的指针值,而不是可能的浮点数。

  

为什么我要返回0或-1而不是结果?

如果要直接返回null,则必须使用某种特殊的“计算失败”返回值,这有点混乱,并且在使用之前让调用者检查结果。这种方式强制result的调用者注意到有状态代码作为返回值,如果调用者想要忽略它,那么他们可以(尽管你不应该忽略状态代码)。

  

显然我会得到7作为结果,但是如何在不返回结果的情况下将其打印出来?

Ed Heal建议add是正确的。但是,如果您使用的是Linux或Mac OS X,我还建议您从终端运行printf - 这通常比打开网络浏览器更方便。

答案 1 :(得分:2)

谢谢你的诚实。令人耳目一新。

该行应为

returnValue = add(2.0, 5.0, &result);

打印结果查找printf - 这样就可以了。

答案 2 :(得分:0)

您声明的代码在声明变量时不会为结果赋值。因此它包含一些随机数。使用此数字执行任何操作显然都很糟糕,因为这会导致程序产生不可预测的结果。这将是所谓的未初始化的变量错误。

您的代码在分配之前不会引用该变量,所以我并不是说您有错误。我只是在分配之前回答结果包含的问题。如果您希望它具有特定值,您可以这样声明:

double result = 7;

并且它总是有一些预定义的值。同样,在你的情况下没有必要这样做,我只是说如果你想要一个总是定义的值你可以。