鉴于两个代码示例首选?在第一个中,返回变量被定义为局部变量。在第二个中,返回变量由调用者传递。您是否可以定义函数并返回传递给它的变量?我只是偏好一个或另一个?有性能差异吗?
float compute_diam(float circumference, float pi) {
float rval;
/* Circumference = pi * diameter, so
diameter = circumference / pi */
rval = circumference / pi;
return rval;
}
和
float compute_diam(float circumference, float pi, float rval) {
/* Circumference = pi * diameter, so
diameter = circumference / pi */
rval = circumference / pi;
return rval;
}
由于
答案 0 :(得分:3)
我认为在这两种情况下,第一种情况更适合以下原因 1.由于性能的原因,当你通过值传递变量时,它会在你声明rval的地方创建一次,并且一旦你将rval传递给函数,并将第一个rval的值复制到第二个。
相反,如果您想以这种方式传递变量,请将其作为参考传递给
void main()
{
float result;
compute_diam(2.1, 3.14, &result);
}
void compute_diam(float circumference, float pi, float* rval) {
/* Circumference = pi * diameter, so
diameter = circumference / pi */
*rval = circumference / pi;
}
完成函数变量后,结果将保存直径值。
答案 1 :(得分:0)
我更喜欢第一个,因为第二个没有任何意义。第二个你没有传入一个引用或一个指向rval的指针,所以你只是分配给一个局部变量(就像你在第一个,但它的创建方式不同),然后将该变量的副本返回给调用者。请注意,您没有将值保存在传递给函数的rval中,而是通过参数列表将其保存在函数创建的本地rval中。
即使第二个例子传递了对rval的引用,我仍然更喜欢第一个,因为rval是常规类型,并且可以轻松有效地复制。我也发现:
float diameter = compute_diam(circumference, pi);
比以下内容更具可读性和简洁性:
float diameter = 0;
compute_diam(circumference, pi, diameter);
如果要将数据放入大型对象/结构中,那么将引用传递给函数会更有意义。多次编译器可以优化与导致返回值副本的函数相关联的副本,因此我可能会继续使用选项1,直到您通过使用分析器发现它需要优化为类似于第2个版本
此外,您可以从参数列表中删除pi并在函数体内创建static const float PI = 3.14xxxx;
。
答案 2 :(得分:0)
有时您可能想要传递变量的引用,然后填充它将适当的值或返回代码。
然而,第二个定义没有任何意义。
int foo()
{
int a=6;
return a; // This is ok
}
int foo(int a)
{
a = 5;
return a; // Calling function cant access the value 5 in the parameter
//passed, it has to hold it in another variable
}
void foo(int* a)
{
*a=5;
return; // Here you can return and still access the value 5 in the calling
//function with the variable passed to it
}
因此我假设您想要在第一种和第三种方法之间做出决定,我会说它的具体实施方式。如果要传递一系列返回值(读取数组,结构),可以使用第二个。
答案 3 :(得分:0)
通常,将返回值存储在作为参数传递的地址的唯一原因是:
如果查看标准C库或大多数API,您会发现很少的返回值实例存储在作为参数传递的地址中。
答案 4 :(得分:-1)
这让我觉得你不明白返回值是什么或者如何给函数赋予参数。
在第二个示例中,您不会修改函数调用时提供的rval
,而是修改它的副本。然后,您将返回rval
的值。
你的第二个例子是“错误的”(从逻辑的角度来看)。
你要做的是
void compute_diam(float circumference, float pi, float& rval) {
/* Circumference = pi * diameter, so
diameter = circumference / pi */
rval = circumference / pi;
}
编辑:更正,上面只是C ++,在C中你会做以下
void compute_diam(float circumference, float pi, float* rval) {
/* Circumference = pi * diameter, so
diameter = circumference / pi */
*rval = circumference / pi;
}
其中rval
通过引用给出,并且函数不返回任何内容(void)。
但是在这种简单的情况下应该避免这种情况,如果函数返回一个值,接口会更清楚。
修改强> 为了说服你,你的第二个例子形成不良,请考虑以下事项:
浮动my_result = compute_diam(2.0,3.14,'为什么我会放在这里?my_result?')