如何解决局部静态变量如何在方法中工作?
下面是我的代码:
//main.c
int f()
{
static int x = 0;
x += 1;
return x;
}
int main()
{
f();
printf("%d",f());
}
,输出为2
。
我知道静态变量将保持状态,但是由于我两次调用f()
,因此每次x
首先设置为0(static int x = 0;
),然后再设置1,然后输出即可不管我打1
多少次,都应该是f()
?
解决方法
static
变量不仅持久存在,而且仅初始化一次,因此,x
不是“ 每次设置为0” ,它仍然是1
在第二次通话中,然后递增。确实如此
static int x = 0; // x is initialized once only
与
有很大不同static int x;
x = 0; // x is set to 0 with every call
,
每次x设置为0
否,您正在错误地阅读代码。这里的=
并不表示赋值,而是表示初始化,因为它是声明的一部分。变量的初始值显式指定为0。静态变量在程序执行期间仅初始化一次。如果它们的声明出现在函数内,则不会改变该行为。
此外,静态变量的初始化程序必须是常量表达式(可以在编译时将其评估为已知值的表达式)。这意味着实际上,实现无需引入代码即可在函数内部进行任何初始化。该值可以在程序启动时简单地加载到变量的存储中。
,您对f()
进行了两次调用,x具有静态存储持续时间,其生存期是程序的整个执行过程。这就是为什么打印2而不打印1的原因。
“ ...,但是由于我两次致电
f()
,因此每次x
首先设置为0
(static int x = 0;
)。 ..“
不。每次调用x
时,0
均未设置为f
。
static
变量在第一次调用定义它们的函数时仅初始化一次。
与auto
数学变量相比,特殊之处在于分配的内存对象一直保留到程序结束。
在对函数x
的不同调用之间,对象和f
的值保持不变。因此,x
在每次调用该函数时都会增加一,而无需重置为曾经初始化的值。
// Calls to f() in order
f(); // value of x at the end of the function: 1
f(); // value of x at the end of the function: 2
f(); // value of x at the end of the function: 3
f(); // value of x at the end of the function: 4
// and so on.
因此,当您两次调用f()
时,函数返回时2
是x
的正确值。
旁注:
-
0
的显式初始化是多余的。static
变量默认情况下初始化为0
。 -
C中函数的参数列表定义/声明不应遗漏。代替
int f()
,写int f(void)
。int main()
也应编辑为int main (void)
。int main()
已过时。
静态变量也可以在本地范围内声明。 static
持续时间 表示对象或变量是在程序启动时分配,在程序结束时释放。(from here)
因此,对于您的示例程序而言,2
是正确的:
以下示例代码以及顶部的语句说明了原因:
首次通话:
static int x = 0; // unlike non-static variables,initialization is executed
// only once on 1st call to function.
// Also unlike non-static,local variables,locally created static
// variables are initialized to 0 automatically
// making the explicit assignment to 0 unnecessary.
// (although still a good habit. :))
...
x++; //x==1
第二次通话:
static x = 0 //skipped
...
x++; //x==2
第3次通话:
static x = 0 //skipped
...
x++; //x==3
依次类推,直到程序结束...
(已将x += 1;
替换为惯用的快捷方式语法:x++;
)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。