1. 程式人生 > >C語言 - while迴圈體內變數重新宣告,陷入死迴圈。

C語言 - while迴圈體內變數重新宣告,陷入死迴圈。

今天寫一個實驗程式碼時,用到了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;同樣的語句,會造成不一樣的結果,可能和你想想的不一樣。