将i定义为全局变量,和定义为局部变量为什么差距这么大?

JRzui 2017-02-27 02:16:52
#include <stdio.h>
#include <stdlib.h>
int a[10],book[10],n;
void dfs(int step)
{
int i;
if(step==n+1) //判断是否为第n+1个盒子,那么前面n个盒子已经放好牌了
{
//输出一种排列
for(i=1;i<=n;i++)
printf("%d",a[i]);
printf("\n");

return; //返回之前的一步,也就是上一次调用dfs函数的地方
}

//每次按从小到大放排
for(i=1;i<=n;i++)
if(book[i]==0) //第i张牌未被使用过
{
a[step]=i; //将牌放到第step个盒子中
book[i]=1; //标记已被使用过
dfs(step+1); //进行下一个盒子
book[i]=0; //将刚刚尝试的扑克牌收回,好进行下一次尝试,这一步非常重要!!!!
}
return;
}

int main()
{
scanf("%d",&n); //n要在1~9之间
dfs(1); //首先站在一号盒子前面
return 0;
}
如上,将 i 在dfs中声明时 输入n为3
输出为3的全排列
但将 i 作为全局变量的时候就只能输出 123了
这是为什么啊
...全文
371 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
自信男孩 2021-01-15
  • 打赏
  • 举报
回复
这是生命周期决定的,局部变量的生命周期是函数内,从定义开始到函数结束就结束了。全局变量是从定义开始到程序退出。局部变量时函数内可见,而全局变量是整个程序里可见的。
赵4老师 2021-01-15
  • 打赏
  • 举报
回复
全局变量在.data区; 局部变量(除static修饰的静态局部变量和全局变量一样在.data区)在.stack区,且每个函数栈帧中各有一份。 抽空了解一下每句C/C++语句对应的汇编指令。
forever74 2021-01-15
  • 打赏
  • 举报
回复
局部变量就是每个人的钱包 全局变量就是公司账户 如果都随便花公司账户,这公司当然开不下去了。
paschen 2017-02-28
  • 打赏
  • 举报
回复
局部变量每次调用函数都不是同一个,全局变量则是同一个
小灸舞 版主 2017-02-28
  • 打赏
  • 举报
回复
因为你函数有递归调用,如果是局部变量,每次调用的i都是相互独立的。
而如果是全局变量,则是同样的i
_mervyn 2017-02-27
  • 打赏
  • 举报
回复
为什么感觉这么憋屈,不知道要怎么跟你说呢。。大概是因为你的问题是“定义为全局变量,和定义为局部变量为什么差距这么大?”,而不是“全局变量和局部变量的区别是什么?”。 首先我想问你,你理解的全局变量,和局部变量,是什么样的一个区别? 然后,你是否已经完全的理解了你这段代码的含义? 你如果都理解正确,我觉得不应该还会有这样的疑问。 单纯的说下这个问题的原因: 如果你把 i 声明为全局变量,显然是不行的,你每次dfs调用都会改变 i 的值,那么返回到循环中后,其作为索引的意义就已经被破坏了。 吐槽一下。。 如果把你的例子来说明 全局变量和局部变量的区别,那给我的感觉就像是下面这样的场景: 说有一辆公交车,始发站时有n个人,到达第一站后上了2个人,下了1个人,到达第二站后,上了3个人下了2个人,…………(此处省略1千字),到达第m站,上了m+1个人,下了m个人。 当我读完题目,正要愉快的给出 车上还剩几个人的时候,结果问题却是,这辆公交车一共经过了几站。。。。。 不知道你有没有懂我想表达的意思。
flying_music 2017-02-27
  • 打赏
  • 举报
回复
因为如果定义成局部变量,那每次调用dfs时,都会创建一个i,第一层中的i和第二层中的没关系 如果定义成全局的,每一层中的i都是同一个,这一层中i变了,下一层也会变化,所以下层中的循环会“提前”结束 如有问题欢迎继续追问,没问题请及时结贴,谢谢

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧