鱼C论坛

 找回密码
 立即注册
查看: 3089|回复: 3

一个C语言问题

[复制链接]
发表于 2011-12-23 01:51:36 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 bui159 于 2011-12-23 11:51 编辑
  1. #include <stdio.h>
  2. int a=2;
  3. int f(int n)
  4. {
  5.        static int a=3;
  6.        int t=0;
  7.        if(n%2)
  8.        {
  9.               static int a=4;
  10.               t+=a++;
  11.        }
  12.        else
  13.        {
  14.               static int a=5;
  15.               t+=a++;
  16.        }
  17.        return t+a++;
  18. }
  19. void main()
  20. {
  21.        int s=a,i;
  22.        for(i=0;i<3;i++)  s+=f(i);
  23.        printf("%d\n",s);
  24. }
复制代码
最后s=29   不知道怎么算出来的 还请高手详解
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-12-24 13:45:23 | 显示全部楼层
#include <stdio.h>
int a=2;(这是全局变量)


static int a=4;(这里的a 是静态的局部变量)
    t+=a++;


C语言规定:当某函数内定义有与全局变量同名的局部变量时,则局部变量起作用,同名的全局变量被屏蔽。

关于静态变量(static)生存期:函数执行前变量就已经存在,这点有别于(auto)自动变量,并且函数被调用,执行期间修改了静态变量的值,则函数执行完后,该值仍然被保存,并将作为下次调用时该函数的初始值。

那么既然全局变量(最简单特征:在所有函数外定义的变量)的生存期是从程序执行开始到程序结束,那么他也有保存修改后值的能力,在这里注意作用于和生存期两个问题后,就能明白变化了。

具体流程:i = 0 , 1 , 2;
(1)
i = 0;
a = 2;(此程序中只有在main()函数中有效)
s = 2+ f(0);
进入函数,f(0):
a = 3;(此时发生全局变量被屏蔽 , 此值在f()函数中有效)
(0%2 == 0)所以执行else
a = 5;(此时发生全局变量被屏蔽 , 此值在else{}中有效)
t = 0 + 5;   
++:a = 6; (此值在else{}中有效
退出{}后
      a = 3;   (此值在f()函数中有效)
return t+a++    ->   5+3
a++:a = 4;(此值在f()函数中有效 , 保存,下次进入时使用)
s = 2+8 = 10;

(2)
i = 1;
s = 10+ f(1);
进入f()函数:
a = 4;(进入时此次用的是上次退出时保存的值,即使在有赋值语句int a = 3,这次不会再被覆盖)
f(1):  (1%2 != 0)所以执行if
a = 4;(此时发生全局变量被屏蔽,此值在if{}中有效)
t = 0 + 4;   
++:a = 5; (此值在if{}中有效,保存在下次进入if时使用
退出if{}后a = 4;
return t+a++    ->   4+4
a++:a = 5;(此值在f()函数中有效 , 保存,下次进入时使用)

s = 10+8 = 18;

(3)
i  = 2;
s = 18 + f(2);

进入f()函数:

a = 5;(进入时此次用的是上次退出时保存的值)
f(2):(2%2 == 0)执行else{}
a = 6;(上次保存在else{}退出时的值
t = 0 + 6;
++:a = 7;(此值在else{}中有效)
退出else{}a = 5;
t = 6 + 5;
return 11;
++ : a = 6;(此值在f()函数中有效 , 保存,下次进入时使用

s = 18 + 11;

终于搞定了,开始以为说起来很简单呢,结果这么难讲,还好完成了。多多调试会收获不少的。加油!

小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-12-24 14:47:21 | 显示全部楼层
楼上回答得好详细,顶一个。
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2011-12-24 23:40:28 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-11-10 10:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表