标题: C语言选择排序中交换数据的不同方式出现的不同结果 求分析 [打印本页]

作者: huh    时间: 2020-4-5 13:50
标题: C语言选择排序中交换数据的不同方式出现的不同结果 求分析
  1. //选择排序,升序
  2. void main()
  3. {
  4.     int i,min,j,t;
  5.     int a[5]={5,3,4,21,2};
  6.     for(i=0;i<4;i++)
  7.     {
  8.         min=i;//默认此时的a[i]最小
  9.         for(j=i+1;j<5;j++)
  10.         {
  11.             if(a[min]>a[j])
  12.             {
  13.                 min=j;
  14.             }
  15.         }
  16.         if(min!=i)//找到了可以交换的数
  17.         {
  18.             min=a[i];//无t是5,21,2,3,4;有t是-85899346021234;用t来交换是234521
  19.             a[i]=a[min];
  20.             a[min]=min;
  21.         }
  22.     }
  23.     for(i=0;i<5;i++)
  24.     {
  25.         printf("%d,",a[i]);
  26.     }
  27. }
复制代码

0.png (22.62 KB, 下载次数: 117)

0.png

作者: 邢成志    时间: 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