Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C中的按引用传递:结果变量是如何初始化的?_C_Pass By Reference - Fatal编程技术网

C中的按引用传递:结果变量是如何初始化的?

C中的按引用传递:结果变量是如何初始化的?,c,pass-by-reference,C,Pass By Reference,我是C语言的新手,我必须制作一个微型计算器程序(这是家庭作业,但我不是在寻找答案,只是多了解一点)。基本上,一个函数必须如下所示: int add(double d, double dd, double *result); double result = 7; 如果没有错误,它将返回0;如果发生错误,它将返回-1(在加法的情况下,不会有很多错误,但是除法(例如,除以0)将是一个错误) 用户必须在终端中输入两个数字,然后在add方法中将这些数字用作参数值。我不明白的是,调用方法时最初的结果是什

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

int add(double d, double dd, double *result);
double result = 7;
如果没有错误,它将返回0;如果发生错误,它将返回-1(在加法的情况下,不会有很多错误,但是除法(例如,除以0)将是一个错误)

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

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

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

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

现在谈谈你的实际问题:

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

否,在调用
add
函数之前,
result
的值未定义。如果您在赋值之前尝试使用
result
的值,无论是在声明它的函数中赋值还是在
add
中赋值,都无法保证这一点,代码类似于
*result=d+dd

因此,double永远不能是
null
。Null是一个可能的指针值,而不是一个可能的浮点数

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

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

很明显,我会得到7作为结果,但是我如何在不返回结果的情况下打印出来呢


Ed Heal的建议是正确的
printf
。不过,如果您使用的是Linux或Mac OS X,我也建议您从终端运行
man printf
,这通常比打开web浏览器更方便。

感谢您的诚实。它令人耳目一新

这行应该是

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

然后打印结果查找-这就可以了。

声明变量时,您编写的代码不会为结果赋值。因此它包含一些随机数。显然,使用这个数字做任何事情都是不好的,因为它会导致您的程序产生不可预测的结果。这就是所谓的未初始化变量错误

您的代码在赋值之前没有引用变量,所以我不是说您有bug。我只是简单地回答了一个问题,即在分配结果之前,它包含什么内容。如果希望它具有特定的值,可以这样声明:

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

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

除非
returnValue
成功,否则不要使用/print
result
。正如您所说,C没有引用,但指针是C标准中的引用。您的答案将不会用C编译器编译。很抱歉,这是我的输入错误。我现在已经修复了它。@AdrianCornish“指针是引用”不是真的。埃里克·利珀特(Eric Lippert)写到了这种差异。post是特定于C的,但许多相同的原则适用于C。此外,在这种特殊情况下,没有可能的值可以用作“计算失败”返回值,由于您选择的任何
double
也是两个
double
s之和的合法返回值。C99标准
的@Veredesmarld 6.2.5.20指针类型描述了一个对象,其值提供了对引用类型实体的引用