1

私のプログラミング哲学の 1 つは、変数を実際に初めて使用する直前に定義することです。たとえば、変数 'x' の定義方法ですが、通常、次のようなコードは書きません。

var total =0;
var x;
for(int i=0;i<100000;i++)
{
   x = i;
   total += x;
} 

代わりに、私はこれを好みます:

var total = 0;
for(int i=0;i<100000;i++)
{
   var x = i;
   total = +x;
} 

これは単なるコード例であり、コードの実際の意味は気にしないでください。

2番目の方法の欠点は何ですか?パフォーマンス?

4

5 に答える 5

4

本当に必要でない限り、パフォーマンスを気にしないでください(ヒント: 99% の時間は必要ありません)。

私の通常の哲学 (「The Art of Readable Code」などの本で確認されています) は、可能な限り最小のスコープで変数を宣言することです。その理由は、可読性とコード理解の観点から、一度に考えなければならない変数が少ないほど良いからです。そして、より小さなスコープで変数を定義することは、間違いなくそれを助けます。

また、多くの場合、(あなたの例の場合) 変数を for ループの外に移動して、反復ごとに変数を作成/破棄する必要があることをコンパイラが判断できる場合、結果は変わりませんが、パフォーマンスは向上します。あなたのためにそれをします。そして、それがパフォーマンスを気にしないもう 1 つの理由です。通常、コンパイラは私たちよりもパフォーマンスに優れています。

于 2013-06-30T01:59:30.167 に答える
3

パフォーマンスへの影響はなく、スコープのみです。可能な限り最も内側のスコープで変数を定義する必要があります。これにより、プログラムの可読性が向上します。

于 2013-06-30T01:47:37.540 に答える
0

ほとんどの場合と同様に、変数を内部スコープ内に保持することをお勧めしますが、例外が発生し、それがあなたが求めているものだと思います.

C++ には潜在的に高価なコンストラクター/デストラクター時間があり、N 回ではなく 1 回支払うのが最適です。比較

void TestPrimacyOfNUnsignedLongs(int n) {
  PrimeList List();  // Makes a list of all unsigned long primes
  for (int i = 0; i<n; i++) {
    unsinged long x = random_ul();
    if (List.IsAPrime(x)) DoThis();
  }
}

また

void TestPrimacyOfNUnsignedLongs(int n) {
  for (int i = 0; i<n; i++) {
    PrimeList List(); // Makes a list of all unsigned long primes
    unsinged long lx = random_ul();
    if (List.IsAPrime(x)) DoThis();
  }
}

確かに、ループ内に入れることはできますが、かなりの実行時間コストがかかります。Listfor

于 2013-06-30T04:23:33.720 に答える
0

唯一の「欠点」は、2 番目のバージョンではコンパイラのサポートが必要なことです。古いコンパイラは、関数 (またはその中のスコープ) が使用するすべての変数を知る必要があったため、特別なセクション (Pascal) またはブロックの先頭 (C) で変数を宣言する必要がありました。これは、今日では実際には問題ではありません。C は、変数の宣言をサポートしていない唯一の言語であり、依然として広く使用されています。

問題は、C が学校や大学で教える最も一般的な第一言語であることです。彼らはあなたに C を教え、ブロックの先頭ですべての変数を宣言するように強制します。次に、より現代的な言語を教えます。最初にすべての変数を宣言することにすでに慣れているため、それをしないように教える必要があります。

最初の言語で関数本体のどこでも変数を宣言できる場合、変数を使用する直前に本能的に宣言することになります。事前に変数を宣言することは悪いことであると伝える必要はありません。 5 キロのハンマーでコンピューターを壊すのはよくないと教えてください。

于 2013-06-30T02:05:22.033 に答える
-4

コードの同じ場所に同じスコープのすべての変数があると、どの変数があり、どのデータ型があるかを簡単に確認できます。コード全体を調べる必要はありません。x 変数のスコープが異なります。2 番目の例では、ループの外で x 変数を使用することはできません。

于 2013-06-30T01:44:21.820 に答える