2 qq 31739181 qq_31739181 于 2016.02.13 12:16 提问

static的一个问题,运行结果和书上说的不一样。
c

#include
void fun1(static int v) {

printf("%d\n",v);

}
int main(void) {
fun1(50);
fun1(100);

return 0;

}

7个回答

91program
91program   Ds   Rxr 2016.02.13 12:31

可能是书上搞错了吧,以实际编译/运行的结果为准。
如果没有 static 时,结果肯定是 50 和 100;但就算是有了 static,传入参数的值是多少,printf 中应该是多少,不会由 static 的影响。

u014634869
u014634869 关注您了
接近 2 年之前 回复
qq_31739181
qq_31739181 回复辞哥: 我也是初学
接近 2 年之前 回复
u014634869
u014634869 你们都是前辈 我是一个初学者 才学不长时间 希望您给解释一下
接近 2 年之前 回复
u014634869
u014634869 可是书上所说的 static内存只分配一次 返回的值不应该是上一次返回的值吗 不应该只有一个值吗 应该是50 50 啊
接近 2 年之前 回复
91program
91program   Ds   Rxr 2016.02.13 12:51

如果在 VS2018 中编程,首先会产生一个编译警告:
warning C4042: “v”: 有坏的存储类
然后,运行的结果也确实是:50 和 100.

静态变量,确实如你所说只分配一次内存、且只初始化一次,但后继对静态变量的赋值是有效的。一般静态变量用在函数体中,上述描述是没有问题的。
但如你所说的做为函数的参数,由于调用时会给参数完成一次赋值的过程,所以应该会改变静态变量的值。

91program
91program 回复辞哥: 是的,参数的传递,肯定是有赋值的过程。
接近 2 年之前 回复
u014634869
u014634869 虽然不是很懂 但是感觉好像是那个意思 就是当静态变量确实只分配一次内存 但是当静态变量在函数体中的时候 ,后续的赋值还是可以显式的 是这么个意思吗 我也不懂 只是最近在看书 想到了这一点 麻烦您给解答了
接近 2 年之前 回复
qq_31739181
qq_31739181   2016.02.13 12:18

书上给结果是50 和 50,而运行结果是50 和 100

u014634869
u014634869   2016.02.13 12:34

我是一个初学者 不知道对不对 你可以找一些大神来问一下 我认为书上是对的 static内存只分配一次 返回值了之后下次返回的还是上一次的值 我不知道对不对 你再问问其他大神把

qq_31739181
qq_31739181   2016.02.13 13:10

书的原题是这样的:
#include
void fun1(int v) {
static int value=v;
}
int main(void) {
fun1(50);
fun1(100);
return 0;
}
没有输出语句,程序的输出应该为多少

collin18
collin18   2016.02.18 20:02

没有输出语句,就不会有输出结果的。

u011491972
u011491972   2016.08.29 11:27

你的核书上不一样,你就说书上错了。
#include
void fun1(int v) {
static int value=v;
printf("%d\n",v); // 50 50
}
int main(void) {
fun1(50);
fun1(100);
return 0;
}

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!