为什么const关键字在代码块中重新评估?

时间:2017-11-20 07:31:33

标签: c++

代码:

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每次被调用都可以改变?

因为,while循环启动新代码块(在堆栈区域中),
所以,我认为变量delta存在于循环执行时。


2 个答案:

答案 0 :(得分:4)

因为你在循环的每次迭代中得到一个新的变量。

变量delta的范围仅限于循环体。这意味着它将在每次迭代时被销毁并重新创建。 const只是意味着它的值在它活着时不能改变,但是由于你在每次迭代时重新创建它,它的值可能确实在迭代之间改变,而不是在单次迭代的过程中。

请注意,在C ++中,可以以一种在程序的整个生命周期中保持变量的方式声明变量,即使它的范围是左边的。这就是static关键字的用途。将您的delta声明更改为static const float delta = std::min( playTime, dt );,它将始终保持相同的值。

在这种特殊情况下,在循环之前移动声明可能更好,因为static也会通过多次调用函数Test来保持变量。

答案 1 :(得分:3)

delta的范围是while循环的块。它在它开始时就会生命,并在最后死亡。每次进入和退出块时都会发生这种情况,即每次迭代。

const限定符仅表示您无法在活动时对其进行修改。它不会改变其寿命。从本质上讲,每次执行块时它都是“不同的”delta

如果希望每次迭代都修复它,则必须将其移动到封闭范围(例如函数体),并在那里进行初始化。