意外的静态计数器变量行为
Posted
技术标签:
【中文标题】意外的静态计数器变量行为【英文标题】:Unexpected static counter variable behaviour 【发布时间】:2017-11-17 01:39:40 【问题描述】:最近我尝试了解 static 关键字,在这里我尝试简单地将 static 关键字用于函数中的变量声明。像这样:
void counter()
static int counter = 0; //should be initialized only once and once only
counter++; //increment for every call of this function
我知道由于变量是静态的,它将存在于函数之外,因此无论我决定打印计数器,它应该给我函数 counter()
被调用的次数。于是我做了一个简单的测试,如图:
int main()
for(unsigned int i = 0; i < 10; i++)
counter();
std::cout << counter << std::endl;
return 0;
从这个测试中,我希望得到数字 10...但是返回的代码的计数是 1。
请问,我错过了什么?
我发现了其他“类似”问题的提交,例如: static counter in c++ 但它们主要围绕类中使用的 static 关键字。
【问题讨论】:
std::cout << counter
与 std::cout << counter()
。只是一个印刷错误。
静态变量counter
只能在函数counter()
内访问。在它之外,标识符 counter
指的是函数。
您没有打印counter
。看到这个答案***.com/a/2064722/1143634
某物是否“留在内存中”完全独立于对象标识符的范围。
@mira_x 您正在尝试打印函数地址,但不能简单地使用std::ostream
打印,因此它会隐式转换为bool
。所以你的代码基本上一直打印true
。如果您启用警告-Wall -Wextra
,GCC 会警告您。
【参考方案1】:
您在未声明的main()
中打印counter
。仅仅因为您在 counter()
中将其声明为 static
并不意味着您可以在 main()
中访问它。
如果你这样做:
void counter()
static int counter = 0;
std::cout << counter++ << std::endl;
int main()
for(unsigned int i = 0; i < 10; i++)
counter();
return 0;
你可以看到计数器在递增。
【讨论】:
【参考方案2】:counter
在void counter()
中仍然是一个local
变量,所以您仍然需要返回它。
【讨论】:
以上是关于意外的静态计数器变量行为的主要内容,如果未能解决你的问题,请参考以下文章