問題的由來是我寫了一個排序算法程序,在gcc編譯器下運行,發現結果有問題,然後開展的尋找錯誤解決問題
這是我寫的一個簡單的插入排序算法
#include <stdio.h>
//直接插入法排序函數主體
//參數1:待排序的序列
//參數2:序列的長度
//實現從大到小的排序
void insertSort(int array[],int arraySize)
{
int i , j , tmp,k = 0;
for(i = 1 ; i < arraySize ; i )
{
tmp = array[i];
j = i - 1;
while(j >= 0 && tmp > array[j])
{
array[j 1] = array[j--];
}
array[j 1] = tmp;
}
}
int main()
{
int a[7] = {5,6,3,9,2,7,1};
insertSort(a,7);
int i = 0;
for(i = 0 ; i < 7 ; i )
{
printf("%d",a[i]);
}
printf("\n");
return 0;
}
分别在兩個不同的編譯器中去編譯運行,一個是vs2017環境、一個是Linux環境,他們用的編譯器,分别是VS編譯器和gcc編譯器,同樣的代碼,運行出來的結果卻不一樣。
為了定位問題,于是乎,我在程序體中加了多句printf輸出想查看過程信息
具體代碼我是這樣寫的,可以看一下
#include <stdio.h>
//直接插入法排序函數主體
//參數1:待排序的序列
//參數2:序列的長度
//實現從大到小的排序
void insertSort(int array[],int arraySize)
{
int i , j , tmp,k = 0;
for(i = 1 ; i < arraySize ; i ) //循環遍曆序列
{
tmp = array[i];
j = i - 1;
printf("i = %d , j = %d , temp = %d\n",i,j,tmp);
while(j >= 0 && tmp > array[j])
{
array[j 1] = array[j--];
}
for(k = 0;k<7;k )
{
printf("%d",array[k]);
}
printf("\n");
array[j 1] = tmp;
for(k = 0;k<7;k )
{
printf("%d",array[k]);
}
printf("\n");
}
}
int main()
{
int a[7] = {5,6,3,9,2,7,1};
insertSort(a,7);
int i = 0;
printf("最終");
for(i = 0 ; i < 7 ; i )
{
printf("%d",a[i]);
}
printf("\n");
return 0;
}
然後下面這是運行的結果,可以發現,第一次從while循環中出來,兩邊的值就不一樣了,while中隻寫了一句話
array[j 1] = array[j--];
好了,問題找到,就是出在這句話上
于是乎,我們可以知道的是編譯器不同造成的一個差别,并且我懷疑問題出在array[j 1] = array[j--];這句話的j--上,于是上網查閱了相關資料,大體上是這樣說的,我總結在下面了。
在一個循環體之中
gcc編譯器 i 在遇到 '=' 符号時,會先增,而不是在一趟循環結束後再自增的
而VS編譯器,是在一趟循環結束後才會i 的
這應該是gcc編譯器對此做出了自己的優化
所以針對這一塊程序,while裡面我們可以改成這樣,分成兩步走
while(j >= 0 && tmp > array[j])
{
array[j 1] = array[j];
j --;
}
這下運行結果就沒有問題了
資源無套路,跟着學去吧,記得幫我點贊就好
點擊鍊接加入群聊【C語言/C 編程學習基地】:「鍊接」
更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!