为了账号安全,请及时绑定邮箱和手机立即绑定

没看懂fn()和i之间的关系 还有怎么计算的 = =

没看懂fn()和i之间的关系 还有怎么计算的 = =

C
慕斯7080739 2018-04-12 15:07:55
麻烦大佬告知一下  谢谢
查看完整描述

2 回答

已采纳
?
onemoo

TA贡献883条经验 获得超454个赞

第 11 行的 i 跟 fn 中的 x 没有直接关系,i 只是控制 for 循环次数的。i 让 for 循环体执行 5 次,于是调用 fn 函数五次。

多次调用 fn 是为了演示“函数中的 static 变量可以在多次函数调用中保留值”这一点。

你应该能看到这个程序首先打印了 5 次 fn 中第 6 行输出,分别是 x=2、x=4、x=8、x=16、x=32,没错吧?

如果 fn 中第 4 行没有 static,那么 x 只是这个函数的本地变量。这样函数每次被调用时 x 的值都被初始化为 1,那么第 6 行的 printf 每次都会只打印 x=2。

但这里 x 是 static 的,像这样在函数中被 static 修饰的变量仅在函数第一次调用时会被初始化(这里是 1),但在其后的函数调用中并不会被重新初始化,而是会保留之前的值。 所以第二次调用 fn 时这个 x 就是 2,再经过 x*=2 就变成了 4,依此类推...


那么第 16 行的那个 extern int x 呢?

这个 x 和之前 fn 中的 x 没有任何关系,只是名字相同而已。 fn 中的 x 仅在 fn 函数中可用,在函数外根本“不可见”。

16 行这个 x 有 extern 修饰,这表明这里只是个 x 的声明。 如果这里仅仅写 int x 的话,这个 x 默认会成为定义,也就是实际表示一个“单独”的值(这种说法并不规范,但应该好懂)。

那么这个 x 只是声明,编译器知道它代表的值会定义在别的地方。你这个代码中在 main 中可见的 x 除了 16 行这个以外,还有 20 行的那个。

像 20 行这样定义在任何函数外的变量是“全局变量”,在本代码文件中都可见。那么编译器就认为 16 行的 x 是代表 20 行的这个 x 了(因为同名)。而 20 行的 x 是定义,并且值为 100。所以 17 行的 printf 最后会打印 x=100

查看完整回答
1 反对 回复 2018-04-12
  • 2 回答
  • 0 关注
  • 1163 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信