1024手机基地看电影,午夜福利视频导航,国产精品福利在线一区,亚洲欧美日韩另类成人,在线观看午夜日本理论片,成年超爽免费网站,国产精品成人免费,精品动作一级毛片,成人免费观看网站,97精品伊人久久大香蕉
標題:
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://m.raoushi.com/bbs/)
Powered by Discuz! X3.1