2017-11-20 9 views
2

コード:コードブロック中にconstキーワードが再評価されるのはなぜですか?

void Test() 
{ 
    float dt = 0.3; 
    float playTime = 1; 
    while (playTime > 0.0) 
    { 
     const float delta = std::min(playTime, dt); 
     std::cout << delta << std::endl; 
     playTime -= delta; 
    } 
} 

結果:

0.3 
0.3 
0.3 
0.1 

のC++では、constキーワードはが変化しないことを意味します。 したがって、変数constを使用して定数を定数にします。

しかし、この場合、
なぜconst var、デルタは呼び出されるたびに変更できますか?

ループ開始時に新しいコードブロック(スタック領域にある)
だから、変数deltaはすでにループ実行中に存在すると思います。


+2

しかし、デルタはあなたのコード例で決して変更されません。ループの繰り返しごとに 'std :: min'で返された値で初期化する新しい' delta'変数を作成します。 – VTT

+4

あなたは[良い初心者の本か2つ](http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)を取得し、*スコープと*時間*。 –

+0

あなたの助言のために@dudeに感謝します。私は初心者ではない。私はCS専攻で、PLクラスも取得しています。しかし、私はちょうどこの時点でキーワードconstを混同しました。 :) –

答えて

4

ループの繰り返しごとに新しい変数が得られるためです。

変数deltaのスコープはループの本体に制限されています。つまり、すべての反復で破壊され、再作成されます。 constは、その値が生きている間は変更できないことを意味しますが、すべての反復で再作成するので、その値は実際には反復間で変化する可能性があります。

C++では、スコープが残っていても、プログラムの存続期間中存続するように変数を宣言することができます。それはstaticキーワードのためのものです。 delta宣言をstatic const float delta = std::min(playTime, dt);に変更すると、全体に同じ値が保持されます。

しかし、staticは、関数Testを複数回呼び出して変数を永続させるため、ループの前に宣言を移動する方がよいでしょう。

3

deltaの範囲はwhileループのブロックです。それは人生の始まりに来て、最後に死ぬ。これは、ブロックが入力されたり終了したりするたびに、つまり繰り返しごとに行われます。

const修飾子は、生存中は変更できないことを意味します。それはその寿命の範囲を変えません。本質的には、ブロックが実行されるたびに「異なる」deltaです。

各繰り返しごとに固定したい場合は、それを囲みスコープ(関数本体など)に移動し、そこに初期化する必要があります。

関連する問題