C語言 - while迴圈體內變數重新宣告,陷入死迴圈。
阿新 • • 發佈:2018-11-18
今天寫一個實驗程式碼時,用到了while(exp)迴圈。發現exp已經為false。但是依然死迴圈下去。
float T = (float)work[srcNode] / (workAll/6); int consume = 0; float flag = 1.5; while( T > flag ){ consume += (work[srcNode] - work[dictNode]) * node[srcNode][dictNode] / 2; work[srcNode] = (work[srcNode] + work[dictNode]) / 2; work[dictNode] = (work[srcNode] + work[dictNode]) / 2 ; compute(work, &srcNode, &dictNode, &workAll); float T = (float)work[srcNode] / (workAll / 6); }
為了排除實驗邏輯的影響,更加方便描述問題。我重新寫了一個簡單的while(exp)程式碼
int flagWhile1 = 6;
while (flagWhile1 > 1){
flagWhile1--;
printf("%d ",flagWhile1);
}
輸出的結果為。並且可以成功退出。
5 4 3 2 1
那麼問題就來了,怎麼肥事呢?
我仔細看了兩個程式碼,發現一個由於複製貼上引起的不同:
while迴圈體內,計算T的語句是複製的
float T = (float)work[srcNode] / (workAll / 6);
這其實是又聲明瞭一個變數。和while(T>flag)中的T不一樣。
為了驗證我們的想法。再次寫一個簡單的while(exp)。
int flagWhile2 = 6;
while (flagWhile2 > 1){
int flagWhile2=0;
printf("%d ", flagWhile2);
}
執行發現,陷入了死迴圈中,並且一直輸出0。
這也就表明了,while迴圈體中的int flagWhile2其實是重新聲明瞭一個新的變數,並不同於條件判斷中的flagWhile2。
也藉此告訴大家,少用ctrl+c ctrl+v;同樣的語句,會造成不一樣的結果,可能和你想想的不一樣。