| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 510 人关注过本帖
标题:看不懂的程序,结果竟是“i=5,i=2,i=2,i=0,i=2”
只看楼主 加入收藏
wdy0516
Rank: 2
等 级:论坛游民
帖 子:18
专家分:30
注 册:2009-4-1
结帖率:100%
收藏
已结贴  问题点数:1 回复次数:3 
看不懂的程序,结果竟是“i=5,i=2,i=2,i=0,i=2”
#include <stdio.h>
int i=0;
main()
{ int i=5;
  int reset(int),workover(int);
  reset(i/2);   printf("i=%d\n",i);
  reset(i=i/2); printf("i=%d\n",i);
  reset(i/2);   printf("i=%d\n",i);
  workover(i);  printf("i=%d\n",i);
}
int workover(int)
{ i=(i%i)*((i*i)/(2*i)+4);
  printf("i=%d\n",i);
  return i;
}
int reset(int)
{ i=i<=2?5:0;
  return i;
}
第一个i还行,后面的就搞不懂了。
搜索更多相关主题的帖子: 结果 
2010-02-05 19:55
cnfarer
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:179
帖 子:3330
专家分:21157
注 册:2010-1-19
收藏
得分:1 
这是变量的作用域问题
#include <stdio.h>
int i=0;
main()
{ int i=5;
  int reset(int),workover(int);
  reset(i/2);   printf("i=%d\n",i);    //reset(i/2)对i值本身没有影响,i还是5
  reset(i=i/2); printf("i=%d\n",i);    //reset(i=i/2)使i值为i/2的整数即2
  reset(i/2);   printf("i=%d\n",i);    //reset(i/2)对i值本身没有影响,i还是2
  workover(i);  printf("i=%d\n",i);    //workover(i)对i值本身没有影响所以还是2
}
int workover(int x)
{ i=(i%i)*((i*i)/(2*i)+4);    //因为i%i为0,使i为0; (这里的i是全局变量对main中的i没有任何影响)
  printf("i=%d\n",i);        //所以打印出i=0
  return i;
}
int reset(int x)
{ i=i<=2?5:0;    //这里i是全局变量,对main中的i没有任何影响
  return i;
}
在上面两个函数中x不管写成什么,只要是合法的,不会改变最终结果.

[ 本帖最后由 cnfarer 于 2010-2-5 21:25 编辑 ]

★★★★★为人民服务★★★★★
2010-02-05 21:21
广陵绝唱
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:29
帖 子:3607
专家分:1709
注 册:2008-2-15
收藏
得分:0 
把程序改成下面这样再试试:

程序代码:
#include <stdio.h>
//int i=8;
main()
{ int i=5;
  int reset(int),workover(int);
  reset(i/2);   printf("i=%d\n",i);
  reset(i=i/2); printf("i=%d\n",i);
  reset(i/2);   printf("i=%d\n",i);
  workover(i);  printf("i=%d\n",i);
}
int workover(int i)
{ i=(i%i)*((i*i)/(2*i)+4);
  printf("i=%d\n",i);
  return i;
}
int reset(int i)
{ i=i<=2?5:0;
  return i;
}


再改成下面这样试试:

程序代码:
#include <stdio.h>
//int i=8;
main()
{ int i=5;
  int reset(int),workover(int);
  reset(i/2);   printf("i=%d\n",i);
  reset(i=i/2); printf("i=%d\n",i);
  i=reset(i/2);   printf("i=%d\n",i);
  workover(i);  printf("i=%d\n",i);
}
int workover(int i)
{ i=(i%i)*((i*i)/(2*i)+4);
  printf("i=%d\n",i);
  return i;
}
int reset(int i)
{ i=i<=2?5:0;
  return i;
}



    看到了什么变化?头一次改完没有变化,说明全局变量 i 是多余的,它根本就是在迷惑你;第二次改完结果改变,说明了什么?仔细看看,原来的程序没有变量接收返回值,每次输出只是输出 i 值本身.

    祝您学 C 愉快.
2010-02-05 21:26
wdy0516
Rank: 2
等 级:论坛游民
帖 子:18
专家分:30
注 册:2009-4-1
收藏
得分:0 
  非常感谢二位的指教,我的可用分不多,只能这样了
2010-02-08 10:24
快速回复:看不懂的程序,结果竟是“i=5,i=2,i=2,i=0,i=2”
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017657 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved