标题:
C语言选择排序中交换数据的不同方式出现的不同结果 求分析
[打印本页]
作者:
huh
时间:
2020-4-5 13:50
标题:
C语言选择排序中交换数据的不同方式出现的不同结果 求分析
//选择排序,升序
void main()
{
int i,min,j,t;
int a[5]={5,3,4,21,2};
for(i=0;i<4;i++)
{
min=i;//默认此时的a[i]最小
for(j=i+1;j<5;j++)
{
if(a[min]>a[j])
{
min=j;
}
}
if(min!=i)//找到了可以交换的数
{
min=a[i];//无t是5,21,2,3,4;有t是-85899346021234;用t来交换是234521
a[i]=a[min];
a[min]=min;
}
}
for(i=0;i<5;i++)
{
printf("%d,",a[i]);
}
}
复制代码
0.png
(22.62 KB, 下载次数: 117)
下载附件
2020-4-5 14:09 上传
作者:
邢成志
时间:
2020-4-5 16:28
想要交换的话要有一个中间量啊,不然a[min]=min的时候min已经是a[i]的指了,-858993460怎么出来的我也不清楚233
作者:
huh
时间:
2020-4-5 17:15
这要看编译器是如何在栈中组织临时变量的,大部分编译器会按照你定义的变量顺序从栈底到栈顶安排存储空间,所以按照你的定义顺序,你的变量在栈中顺序为:a[0],a[1],a[2],a[3],a[4],t,j,min,i,在t未删除的情况下,初始值是0xCCCCCCCC,即十进制有符号数-858993460,你第一次搜索时,i=0,a[0]=5,min=a[i]=5,接下来a[i]=a[min]执行的是a[0]=a[5],a[5]不在数组中,正是t所在的位置,所以就出现1结果,删除t后,溢出到j的位置,j此时的值是5,所以就出现2的结果,3是正确代码得到的正确结果。
vs2017使用的编译器不是按照你定义的顺序组织变量,一般会先组织构造类型,再组织常规类型。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1