编译器对以下代码没有警告或错误。const限定符的含义被滥用了吗?显然,我不能在同一次循环迭代中重新分配它,但它似乎在每次迭代后都会重新分配。
示例代码:
for(int i = 0; i < 10; ++i)
{
const int constant = i;
}
编译器对以下代码没有警告或错误。const限定符的含义被滥用了吗?显然,我不能在同一次循环迭代中重新分配它,但它似乎在每次迭代后都会重新分配。
示例代码:
for(int i = 0; i < 10; ++i)
{
const int constant = i;
}
const
对程序员来说很有用,可以防止错误,但对于优化器来说却是无用的。原因在于语言中存在const_cast
(包括C风格的转换)、mutable
、指针/引用可能别名等。const
很好,它可以防止错误,但它只对程序员有用,而不是优化编译器。 - Jesper Juhlfor(int i = 0; i < 10; ++i)
{
const int constant = i;
}
constant
具有自动存储期。每次递归执行该块时,都会创建变量的新实例。static
。在这种情况下,变量确实只会被初始化一次,因为它具有静态存储期(在C中,您不可以这样做,因为变量必须由常量表达式初始化)。#include <iostream>
int main()
{
for ( int i = 0; i < 10; ++i )
{
static const int constant = i;
std::cout << "constant = " << constant << std::endl;
}
return 0;
}
它的输出是
constant = 0
constant = 0
constant = 0
constant = 0
constant = 0
constant = 0
constant = 0
constant = 0
constant = 0
constant = 0
这里实际上并没有重新初始化。每次循环都会创建一个新的变量。
constant
局限于循环内部的块中。当块在给定迭代中完成并且控制返回到 for
时,constant
超出了作用域,因此不再存在。当 for
开始下一次循环迭代时,将创建并初始化一个新的 constant
实例。