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

3番目の例でパラメータを参照にすることを主張した理由がわかりません。

于 2011-01-23T16:43:16.223 に答える
1

最初のバージョンについて私が考えることができる合理的な説明の 1 つは、パラメーターを変更したくない場合でも関数を使用でき、結果を返すだけであるということです。そのような関数を書くことは悪いプログラミング習慣であることに同意しません。

于 2011-01-23T16:44:44.313 に答える
1

それは、プログラマーが正確に何を望んでいるかによって異なります。この使用a = f(a)では、結果が明らかに同じになるため、違いはわかりません。しかし、一般的に考えると、 のような使用法でa = f(a) + f(a)は異なる結果が得られます。したがって、それが完全に悪いプログラミング手法だとは言えません。

于 2011-01-23T18:19:08.877 に答える
1

本当に変更したくない場合は、変更しvalueてくださいconst。しかし、正直なところ、そうする理由はありません。

于 2011-01-23T16:39:46.297 に答える
1

参照用の元の値が必要な場合value。たとえば、それに対していくつかの操作を行い、後で同じかどうかを比較したい場合。そして値を返します。

少しわかりにくいようですが、理にかなっています。

于 2011-01-23T16:42:57.283 に答える
0

何らかの用途で元の値が必要になる場合がありますが、それは何をしなければならないかによって異なります。たとえば、一時変数を使用して、「スワップ」中に 2 つのパラメーターのいずれかを格納できます (ただし、STD には組み込みのスワップ関数があります)。

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

それはすべて、関数をどのように使用するかによって異なります。たとえば、次のように関数の最初のバージョンを評価できます。

avariable = f(avalue)

だけavariable変わります。

次のように関数の 2 番目のバージョンを使用できます。

 f(&avalue)

だけavalue変わります。

次のように、関数の最後のバージョンを使用できます。

 avariable = f(&avalue)

avariableと a の両方avalueが変更されます。

それらにはすべて用途があります。それは、プログラマーとしてのあなたが彼らから何を必要としているかによって異なります。自問してみてください: 関数によって変更されて返される必要がある変数はどれですか?

于 2011-01-23T16:41:53.970 に答える