[英]c while loop entry
有人請解釋我原因
int i=0,j=10;
while(j>0,i++){
printf("%d%d",i,j);
j--;
}
不會工作
int i=0,j=10;
while(i++,j>0){
printf("%d%d",i,j);
j--;
}
作品。
還請告訴我原因
int i=0,j=10;
while(j>0,++i){
printf("%d%d",i,j);
j--;
}
給出一個無限循環?
謝謝並恭祝安康
戒
在while循環條件中,使用逗號運算符,它會計算其參數並返回第二個參數。 所以在你的例子中:
while(j>0,i++) - returns i before it gets incremented;
that is 0, so loop won't execute at all
while(i++,j>0) - returns (j > 0) - runs as expected
while(j>0,++i) - returns i - will run until i overflows max int value
閱讀C 逗號運算符 。 基本上它歸結為逗號運算符返回逗號右側的結果 - 所以在第一個例子中,i ++返回0,循環結束。 在第三種情況下,++ i永遠不會為0(至少不會持續很長時間),因此您將獲得無限循環。 中間的情況是可以的,因為j>0
的結果是從逗號運算符返回的,並且你的循環按預期工作。
您正在使用逗號運算符。 逗號運算符的結果是第二個子表達式。 所以j>0,i++
評估為i++
。 i++
最初為0,因此循環永遠不會執行。
同樣, j>0,++i
計算到++i
,在你溢出之前它將是非零的,所以它似乎永遠循環(雖然真的只是很長一段時間)。
i++,j>0
有效,因為last-subexpression是j>0
,這是你想要的實際條件。 請注意,即使逗號運算符拋棄了第一個表達式的結果(在這種情況下為i++
),它仍然會計算該子表達式,因此您仍然會得到副作用(遞增i
)。
在這些情況下,您有包含逗號運算符的表達式。 逗號運算符計算其左操作數,然后計算其右操作數。 結果是右操作數的結果。
目前,讓我們只考慮你的最后一個問題:
int i=0,j=10;
while(j>0,++i){
printf("%d%d",i,j);
j--;
}
這不應該真正無限循環,雖然它可能運行只是有點比預期更長。 由於逗號運算符的結果是右操作數的結果,因此等待++i
變為0.因為它從0開始,它將在終止之前循環通過int
所有可能值。 使用16位int
,可能需要幾分鍾。 隨着32位int
,這將非常需要更長的時間。 使用64位int
,對於任何實際目的來說都是無限循環 - 我很確定我會在它希望以任何速度完成之前很久就會死掉......
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.