为什么在代码块中重新计算 const 关键字

Why const keyword re-evaluated in while code block?

本文关键字:计算 const 关键字 新计算 代码 为什么      更新时间:2023-10-16

代码:

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?

因为,当循环启动新的代码块(在堆栈区域
(,所以,我认为可变的,delta 在循环执行时已经存在。


因为每次循环迭代都会得到一个新变量。

变量delta的作用域仅限于循环的主体。这意味着它将在每次迭代时被销毁和重新创建。const只是意味着它的值在活动时不能改变,但由于你在每次迭代时都会重新创建它,所以它的值确实可能在迭代之间改变,只是永远不会在单次迭代的过程中改变。

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

但是,在

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

delta的作用域是while循环的块。它在开始时复活,在结束时死亡。每次进入和退出块时都会发生这种情况,即每次迭代。

const限定符仅表示您无法在它处于活动状态时对其进行修改。它不会改变其生存期。从本质上讲,每次执行块时都是"不同"的delta

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