0

次に例を示します。

while (i < 10)
    {
        int j = 1;
        string k = "hello.";
    }

j はプリミティブ データ型で、k はオブジェクトです。Do built-in types have default constructors? によると、、

そのため、非クラス型 (基本型、配列型、参照型、ポインター型、および列挙型を含む) にはコンストラクターがありません。

Declaring Variables inside Loops によれば、良い習慣か悪い習慣か? (2人) ,

オブジェクト (std::string など) の場合は、反復ごとにコンストラクターとデストラクターを実行する必要があります。

ただし、while ループ内の変数宣言 C/C++は、

while(i--)
    {
      int i=100; // gets created every time the loop is entered
      i--;
      printf("%d..",i);
    } // the i in the loop keeps getting destroyed here

main()関数が (オペレーティング システムなどによって) 呼び出されると、すべてのローカル変数が関数の開始時に作成され、関数の終了時に破棄されることを学びました。上記の while ループの引用は、プリミティブ データ型iが while ループ ブロックで宣言されたときに作成され、各反復の while ループ ブロックの最後で破棄されることを示しています。

これは本当ですか?#1 while ループ ブロック内でプリミティブ データ型が宣言されており、while ループの反復ごとに割り当てられていますか。#2 while ループ内のこれらの宣言は、while ループ ブロックが含まれている関数の開始時に作成する必要があると仮定するのは間違っていますか?

はいまたはいいえだけでなく、詳細な説明を探しています。

4

3 に答える 3

3

プログラムは、ループのたびに再割り当て (および解放) されるかのように動作する必要があります。

プログラムがその動作を示すメカニズムは、完全にコンパイラ次第です。多くの場合、変数にスペースがまったく割り当てられないか、まったく存在しない可能性さえあります! (j最初の例のように)

スペースが割り当てられる場合、ループを含む関数が呼び出されるときにスペースが予約されるのが一般的だと思います。(そして、そのスペースは必ずしも独占的に予約されているわけではありません)

于 2015-06-21T20:08:31.490 に答える
3

はい、ループ内で変数を宣言すると、プログラムは、変数がループの反復ごとに作成および破棄されたかのように動作します。したがって、変数がクラス型の場合、プログラムはそのコンストラクターとデストラクターが毎回呼び出されたかのように動作します。

ただし、最適化により、観察できない動作を削除できるため、最初のループを最適化して完全に削除し、2 番目のループを次のように最適化できます。

while(i--)
    printf("%d..", 99);

そのため、実際の変数が作成されない場合があります。

于 2015-06-21T20:09:00.023 に答える
1

論理的には、はい、変数はループの反復ごとにループ本体の開始時に作成され、最後に破棄されます。

std::string最初の例では、デストラクタと同様に、 (実際std::basic_string<char>にはこれが何であるか)のコンストラクタがstd::string反復ごとに呼び出されます。同様jに が作成され、1反復ごとに設定されます。

2 番目の例では、同じ理由iで値が出力されます。99

コンパイラには、これにある程度の余裕があります。作成と破棄を繰り返しても効果がないことを検出できれば、変数を有効に保ち、ループの繰り返しごとに変数を再初期化することができます。変数を完全に削除することもできます (たとえば、変数を作成せずに 99 を繰り返し出力するだけです)。ただし、そのようなことは信頼できず、プログラムはそれが発生するかどうかをテストできません。

于 2015-06-21T20:09:47.730 に答える