0

以下技术是否有任何合理的解释:

//value HAS TO BE CHANGED those are requirements
int f(int value)
{
int tmp = value;//In order to not change "value" inside fnc - again requirements
//do something with tmp
return tmp;
}

int a = 0;
a = f(a);//here I assign to a anyway

而不是这个:

void f(int& value)
{
//do something with value
}

或这个:

int f(int& value)
{
//do something with value
return value;
}

您是否同意第一个代码片段(通常)是不良编程实践的一个例子?

4

7 回答 7

3

我看不出有什么原因,tmp = value因为在第一个版本中,参数不是参考,但我认为按值获取参数然后返回更新的副本通常是一个好习惯,而不是获取和修改参考。更少的副作用使代码更容易推理。

所以我想说最好的版本是这样的:

int f(int value)
{
  //do something with value
  return value;
}

int a = f(a);

我不确定您为什么坚持在第三个示例中将参数作为参考。

于 2011-01-23T16:43:16.223 回答
1

如果你真的不想改变value,那就去做吧const。但老实说,我认为没有理由这样做。

于 2011-01-23T16:39:46.297 回答
1

如果您需要原始值以value供参考。例如,如果您想对其进行一些操作,然后进行比较以查看是否相同。并返回值。

似乎有些晦涩,但应该是有道理的。

于 2011-01-23T16:42:57.283 回答
1

这取决于程序员的确切需求。对于这种用法a = f(a),我看不出有什么不同,因为结果显然是相同的。但总的来说,使用诸如a = f(a) + f(a)会给出不同的结果。所以我不能说这完全是一种糟糕的编程习惯。

于 2011-01-23T18:19:08.877 回答
1

对于第一个版本,我能想到的一个合理解释是,即使您不想修改参数,也可以使用该函数,而只返回结果。我不同意编写这样的函数是不好的编程习惯。

于 2011-01-23T16:44:44.313 回答
0

这完全取决于您希望如何使用该功能。例如,您可以像这样评估函数的第一个版本:

avariable = f(avalue)

只会avariable改变。

您可以像这样使用该函数的第二个版本:

 f(&avalue)

只会avalue改变。

您可以像这样使用该函数的最新版本:

 avariable = f(&avalue)

两者都avariableavalue改变。

它们都有它们的用途。这取决于你作为程序员需要从他们那里得到什么。问问自己:您需要返回哪些由函数修改的变量?

于 2011-01-23T16:41:53.970 回答
0

您可能需要原始值进行某些用途,这取决于您必须做什么。例如,一个临时变量可用于在“交换”期间存储两个参数之一(尽管 STD 中有一个内置的交换函数):

void swap(int& first, int& second) {
    int tmp = second;
    second = first;
    first = tmp;
}
于 2011-01-23T16:44:35.997 回答