【发布时间】:2021-08-23 07:51:24
【问题描述】:
先看看:
#include <stdio.h>
static int v1 = 0;
int fun()
{
static int v2 = 0;
++v2 && ++v1;
printf("%i\n", v2);
return v2;
}
int main()
{
++v1;
printf("%i\n", fun());
printf("%i\n", v1);
}
输出:
1
1
2
所以整个事情都是关于 C 中的全局静态和局部静态变量,所以静态变量的主要属性是它“保留它的值”,但在这里它没有,第一段输出是正如预期的那样: fun() 中的v2 的值应该是++v2,即1,但第二部分不是,预期的是当它被main() 调用时,它的保留值将是1,它会再次 ++v2 所以第二个输出应该是 2 。
当我们消除return v2 时,程序按预期运行。
#include <stdio.h>
static int v1 = 0;
int fun()
{
static int v2 = 0;
++v2 && ++v1;
printf("%i\n", v2);
}
int main()
{
++v1;
printf("%i\n", fun());
printf("%i\n", v1);
}
输出:
1
2
2
问题是为什么?谢谢。
【问题讨论】:
-
您只调用该函数一次。你怎么知道它是否在调用之间保留了价值?
-
如果你删除
return v2;你有未定义的行为,因为函数被声明为返回一些东西。 -
我明白了,该函数是未定义的“种类”,但它仍然返回一个值,即变量
v2的值,并且该变量在第一个++v2中静态保留其值,而当有一个变量没有保持其值的返回语句时,对于您的第一条评论,该变量在函数中被调用两次,它是自身和外部。 -
变量的值为
1在++v2之后。为什么你认为它没有保留它?
标签: c scope static global-variables local