簡體   English   中英

c循環輸入

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM