关于职能宣言的问题

时间:2010-08-30 14:35:50

标签: c function syntax coding-style

鉴于两个代码示例首选?在第一个中,返回变量被定义为局部变量。在第二个中,返回变量由调用者传递。您是否可以定义函数并返回传递给它的变量?我只是偏好一个或另一个?有性能差异吗?

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;
}

由于

5 个答案:

答案 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?')