1

多くの場合、ほとんどの場合、配列をループして要素に値を割り当てるときに、ポスト インクリメント演算子を使用するスコープがあります。それは良い習慣と考えられていますか?

たとえば、コピーが行われている次のコードでは、どちらが優れているかを示します。

int [] to_assign;
int [] to_include;
int [] from_assign;

// Version 1
int count = 0;
while(i<<some_value>){
  if(to_include[i]==1)
     to_assign[count++] = from_assign[i];
}

// Version 2
int count = 0;
while(i<<some_value>){
  if(to_include[i]==1)
  {     
      to_assign[count] = from_assign[i];
      count++;
  }
}
4

4 に答える 4

3

それは純粋にスタイルの問題です。個人的には、最も論理的に意味のある方を使用します。インクリメントが論理的に操作の一部である場合は、ポストインクリメントを使用します。そうでない場合は、別のインクリメント操作を使用してください。

また、インクリメント演算子を単独で使用する場合は、通常、事前インクリメントを使用することをお勧めします。整数のような単純な型では問題になりませんが、より複雑な型では、事前インクリメントで2つのインスタンスが同時に存在する必要がないため、演算子のオーバーロードがあるC++のような言語でははるかに効率的です。Javaには演算子のオーバーロードがないため、パフォーマンスへの影響はありませんが、一貫したスタイルルールが必要な場合は、ポストインクリメントではなくプレインクリメントにする必要があります。

于 2013-01-05T08:46:42.550 に答える
1

私は、2番目の解決策はおそらく少し読みやすいと主張します。つまり、目は割り当てが行われていることを観察し、次に増分があることを観察します。両方を同じ行にまとめると、一目で読みにくくなります。だから、私は解決策2を好むでしょう。

とはいえ、これは好みの問題です。ここでは、確立されたベストプラクティスやより良いプラクティスについて話すことはできないと思います。

パフォーマンスの最後の1オンスが重要だった時代には、最初のソリューションでわずかに最適なアセンブリを出力するというコンパイラーの変更が多いため、最初のバージョンが好まれていました。

于 2013-01-05T08:56:59.407 に答える
0

どんな優れたコンパイラでも、とにかくこれを最適化します。人間が読める形式である限り、すべて問題ありません。

「++」はポインタ演算の時代の残り物です-整数に「+=1」を好む人もいます。ただし、コンパイラは、このような単純なケースを正しく管理する必要があります。

于 2013-01-05T08:48:06.240 に答える
0

最近のコンパイラはとにかくこの種のコードを最適化するので、最終的には変数をどこでどのようにインクリメントするかは重要ではありません。

スタイルの観点からは、最初のバージョンは小さく、読みやすいものもあります。

コード理解の観点から、2番目のバージョンは初心者の開発者にとって理解しやすいものです。

パフォーマンスの観点から、コンパイラの最適化を無視すると、これはさらに高速になります。

// Version 3
int count = -1;
while(i<<some_value>){
    if(to_include[i]==1)
    {
        to_assign[++count] = from_assign[i];
    }
}

理論count++的には、増分の前に値の一時的なコピーを作成++countし、同じ変数を増分して使用するため、より高速です。しかし、繰り返しになりますが、コンパイラーはそのような頻繁なケースを検出し、生成されたコードを最適化できるため、この種の時期尚早な最適化はもはや必要ありません。

于 2013-01-05T08:51:41.673 に答える