猿问

115. 若有如下函数定义:

115. 若有如下函数定义:
int fun()
{
static int k=0;
return ++k;
}
以下程序段运行后屏幕输出为( )。
int i;
for(i=1;i<=5;i++) fun();
printf("%d",fun());
A. 0
B. 1
C. 5
D. 6

求会的大神详细解析下,谢谢

包小龙虾
浏览 994回答 2
2回答

onemoo

printf 打印的是什么? 是 fun() 的值!  这是什么意思?这里的 fun() 就是个表达式,这是“函数调用表达式”。还记得吧,每个表达式都有值,“调用表达式”的值就是函数的返回值。当然,fun 函数需要被调用运行才会得到返回值,所以 printf("%d",fun()); 这一语句执行期间,fun 函数确实被调用了,它返回的值被 printf 打印了出来。我们来看看 fun 函数中到底执行了什么:int fun() {     static int k = 0;     return ++k; }k 并不是一个普通的函数局部变量,它被 static 修饰了。这样的变量在函数第一次被调用时被初始化,而后函数再次调用时,该变量会保留有前次函数调用时的值(并不会被再次初始化)函数返回 ++k,我相信对自增你已经很清楚了,这里会返回 ++k 表达式的值,也就是 k 自增后的值。在 printf 语句之前,for 循环已经调用过 5 次 fun 了。也就是在 for 语句中 fun 被首次调用,后又被调用了 4 次。在首次调用 fun 时,k 被初始化为 0,然后返回了 ++k 的值,不过返回值并没有被使用,所以我们不管它。但是自增的副作用确实发生了,所以第一次调用 fun 之后,其中 k 的值自增为 1。for 中第二次调用 fun 时,因为 k 是 static 修饰的,所以 k 不会被再次初始化为 0,而是保留了上次的值 1。这样最后 return 语句再次让 k 自增为 2。第三次调用时同理,最后 k 的值变为 3。for 中的最后一次调用,也就是第 5 次调用 fun 之后,k 的值变为 5。后面才是 printf 语句,这里又调用了一次 fun。此时 k 为 5,所以 ++k 表达式的值为 6,这样 fun 最后返回 6。  printf 就打印出 fun 的返回值 6。
随时随地看视频慕课网APP
我要回答