while(1)代表什麼?

請問~ 有一段副程式如下:

void quick_sort(int *A, int left, int right)

{

int low, upper,point;

if(left

point=A[left];

low=left;

upper=right+1;

while(1){

while(A[++low]

while(A[--upper]>point);

if(low>=upper)

break;

swap(A[low],A[upper]);

}

A[left]=A[upper];

A[upper]=point;

quick_sort(A, left, upper-1); -----X

quick_sort(A, upper+1, right); -----Y

}

}

大家都說1就是true,那麼從哪裡看出是什麼條件true?? 如果1就代表數值1,那麼是哪一個變數的數值為1? 另外,我試過推行這個程式出現的值確很奇怪.....

原始陣列為A[20]={1,21,0,47,60,15,84,65,77,88,100,93,8,17,36,5,24,63,72,20}

step1:A[20]={1,21,20,47,60,15,84,65,77,88,100,93,8,17,36,5,24,63,72,0}

step2:A[20]={72,21,20,47,60,15,84,65,77,88,100,93,8,17,36,5,24,63,1,0}

step3:A[20]={84,93,100,88,77,72,15,65,60,47,20,21,8,17,36,5,24,63,1,0}

step4:A[20]={88,93,100,84,77,72,15,65,60,47,20,21,8,17,36,5,24,63,1,0}

step5:A[20]={100,93,88,84,77,72,15,65,60,47,20,21,8,17,36,5,24,63,1,0}

至此為止quick_sort(A, left, upper-1)-- ---X 執行完,左邊100~72已由大至小排好, 目前的left值仍為0,upper值為2, 代入quick_sort(A,upper+1,right) 所以,

A[left=3]=84,但low=3>upper=2,所以break

A[left=3]=A[upper=2]=88, A[upper=2]=point=84

新陣列:A[2]={100,93,84,88,77,72....} 原本已經排好的資料又亂了......不是很奇怪咩?? 請高手幫忙看看,我是哪裡想錯了.....

4 個解答

評分
  • 9 年前
    最佳解答

    我們先講講 「condition」- 條件判斷 的問題。

    一般而言,只要有用到 (條件判斷) 的地方, C 語言最後都是傳回「整數」型態 (C++ 大多也是如此)。而所謂的「條件成立」,指的是傳回去的「整數」是 "非0",「條件不成立」,指的是傳回去的「整數」為 0。

    我用 while 寫一個非常無聊的程式碼,假設輸入一個數字,大於 0 就繼續輸入,小於等於零就跳出。

    int n;

    do{

    printf("input a integer:");

    scanf("%d", &n); // 讀進整數

    }while(n > 0);

    重點在於 while( n > 0 ) 那裡。

    如果輸入是 1 的話,1 > 0 成立,傳回 1,變成 while(1),非零,繼續執行;

    如果輸入是 2 的話,2 > 0 成立,傳回 1,變成 while(1),非零,繼續執行;

    如果輸入是 0 的話,0 > 0 不成立,傳回 0,變成 while(0),零,不執行了。

    這裡我會比較建議,注意哪裡指令是放 condition,如

    for(初始值設定 ; condition ; 步進值) { 動作 }

    while(condition) {動作}

    do{... 動作...} while(condition);

    if(condition) { 動作 }

    condition 還有一些較罕見用法,這裡就不贅述。

    ------

    總之, condition 成立 -> 傳回非 0 (通常是 1) ;

    condition 不成立 -> 傳回 0。

    故你說的

    while(1)

    {

    }

    它是無窮回圈,跑不完的,即使你用 while(2), while(3), while(-1), while(-2)... etc 都一樣,他們都是 "非0",都視為「真 (true)」。

    所以這個 while(1) 裡面還有一個 break,免得陷入無窮迴圈。

    ----------

    扣除掉原始碼錯誤不少,你的 qsort ,20 個太多了,你會亂 (總共跑 26 次),我只列前 10 元素之步驟

    step 0 (left= 0, right=10):

    1 21 0 47 60 15 84 65 77 88step 1 (left= 0, right= 0):

    0 1 21 47 60 15 84 65 77 88step 2 (left= 2, right=10):

    0 1 21 47 60 15 84 65 77 88step 3 (left= 2, right= 2):

    0 1 15 21 60 47 84 65 77 88step 4 (left= 4, right=10):

    0 1 15 21 60 47 84 65 77 88step 5 (left= 4, right= 4):

    0 1 15 21 47 60 84 65 77 88step 6 (left= 6, right=10):

    0 1 15 21 47 60 84 65 77 88step 7 (left= 6, right= 7):

    0 1 15 21 47 60 77 65 84 88step 8 (left= 6, right= 6):

    0 1 15 21 47 60 65 77 84 88step 9 (left= 8, right= 7):

    0 1 15 21 47 60 65 77 84 88step 10 (left= 9, right=10):

    0 1 15 21 47 60 65 77 84 88step 11 (left= 9, right= 8):

    0 1 15 21 47 60 65 77 84 88step 12 (left=10, right=10):

    0 1 15 21 47 60 65 77 84 88

    這部份不懂、很亂的話,我還蠻建議先看其它遞迴例題,

    recursive 很少人一次就學會 (特別是有些教初學者的會跳過這裡),

    大多都是 "慢慢開通" 比較多,除非真的有急迫的理由必須馬上學會,

    但先去查查「快速排序法」應可得到不少說明資訊。

  • 阿明
    Lv 5
    9 年前

    while(1)是永久迴圈,也就是說while(1){ }裡面程式循環持續執行,

    while(1)裡面永遠是true 程式不會結束永久循環持續執行

  • 9 年前

    謝謝阿風的回答, 但是......我知道1 True,0 False啊~我上面的內容就有提到了唷!我的問題是true的條件或false的條件是什麼??可能內容有點長讓人看不下去唷....呵呵~

    2011-08-12 19:36:52 補充:

    多謝各位熱心的回覆,我了解囉~

  • 阿風
    Lv 5
    9 年前

    bool型態

    1 true 0 反之

    2011-08-11 20:58:59 補充:

    例如

    int num=1;

    while(num){

    scanf("%d",&num);

    }

    只要不輸入零 迴圈就會持續

    反之 輸入零 false 結束

還有問題?馬上發問,尋求解答。