首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么const关键字在Why代码块中重新评估?

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

Stack Overflow用户
提问于 2017-11-20 07:31:32
回答 2查看 71关注 0票数 2

代码:

代码语言:javascript
复制
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;
    }
}

结果:

代码语言:javascript
复制
0.3
0.3
0.3
0.1

在c++中,const关键字意味着不改变。因此,我们使用关键字const使vars常量。

但在这种情况下,

为什么每次调用const,delta都可以更改?

循环启动新代码块(在堆栈区域),

因此,我认为变量,增量已经存在为循环执行。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-11-20 07:38:32

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

变量delta的作用域仅限于循环的主体。这意味着它将被摧毁和重新创建与每一次迭代。const仅仅意味着它的值不能在其存在时发生变化,但是由于您用每次迭代重新创建它,它的值实际上在迭代之间可能会发生变化,只是在一个迭代过程中从未改变过。

请注意,在C++中可以声明一个变量,即使它的作用域保留在整个程序的生存期内。这就是static关键字的作用所在。将您的delta声明更改为static const float delta = std::min( playTime, dt );,它将始终保留相同的值。

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

票数 4
EN

Stack Overflow用户

发布于 2017-11-20 07:34:05

delta的作用域是while循环的块。它从一开始就开始了生命,在最后死去了。每次输入和退出块时,即每次迭代时,都会发生这种情况。

const限定符只意味着您不能在它还活着时修改它。它不会改变它的寿命。本质上,每次执行块时,它都是一个“不同”的delta

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47386982

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档