2015-10-06 128 views
-1
void main() 
{ 
    int a; 
    a=10; 
    do 
    while(a++<10); 
    while(a++<=11); 
    printf("%d",a); 
} 

上述程序給出了14的輸出。 你能解釋爲什麼嗎?C程序while循環

回答

1

大括號會使它更具可讀性,但正如您所擁有的,執行流和的一致的解釋:

enter image description here

+0

很好的解釋。但是當它是14而不是13時它爲什麼會離開? – Deant

+0

@Deant - 看第4步。它在13進入循環,因爲13不是<= 11,而是後增加到14,所以它離開外循環。 – ryyker

+0

我現在明白了。非常感謝 – Deant

0

那麼後增量只會發生在條件被評估之後,所以即使條件爲假,a也會增加,並且可能會增加更多循環的運行次數,然後您會期待。

+0

我知道後增量應用在這裏,但他們如何應用? – Deant

+2

*「他們如何應用?」*答案說:條件評估後。 'a'增加了四次,因爲外部'while'循環被執行了兩次,並且它的兩個語句中的每一個都增加了'a'。正確縮進代碼,它會更容易看到。 –

+0

幾乎你需要明白,最後一次打印只發生一次,因爲它是在「塊」之外(這是爲什麼12不打印)。所以雖然它仍然會數到14,因爲a增加了4次,但只有三次打印會發生(即11,13,14)。 – Parttimereaper

2

此代碼會讓你明白爲什麼,當你鍵入++它總是遞增

void main() 
{ 
    int a; 
    a=10; 
    do{ 
    while(a++<10); 
    printf("%d",a); 
} 
    while(a++<=11); 
    printf("%d",a); 
} 
+0

更混亂。輸出是11 13和14.我明白a的第一個值後遞增得到11.但你怎麼解釋13和14. – Deant

2

這裏你的代碼評估爲

int main() 
{ 
    int a; 
    a=10; 
    do{ 
      //---> second iteration a= 12, for post iteration in while 

     while(a++<10); // First iteration: a=10 ,so false| second Iteration: a=12, so false 

     //First iteration: Here a=11, as previous line's post increment| Second iteration: here a=13, as previous post increment 

    } while(a++<=11); //First iteration: a==11, that evaluete true, go to --->, line after do | Second iteration: a=13, false, loop end goto next line 

    //Here a=14 for post increment in previous line's while loop 

    printf("%d",a); // a=14 
} 

在後增量首先評估與當前值的表達式,然後遞增變量的值。

例如在第二次迭代時,外部程序開始執行時,while(a++<=11),此時a=13與之前的值a一樣。這a++<=11執行並返回0,這使得while(0)(因爲a = 13,這是大於11)。然後增量發生,a變爲14.如while(0)它打破了do-while循環並轉到下一條指令並打印出值14.

+0

很清楚的解釋。但如果條件是錯誤的,爲什麼14打印 – Deant

+0

@Deant,回答編輯,可能你可以理解這一次。 – ashiquzzaman33

+0

現在我明白了。謝謝。 – Deant

2

哦,這是邪惡的。重新格式化代碼應該顯示發生了什麼:

a=10; 
do 
{ 
    while(a++<10); 
} 
while(a++<=11); 

所以。 a最初設置爲10。我們輸入do while循環。 do while循環中的唯一聲明是while(a++ < 10);。請記住,表達式a++評估爲當前值a,並且作爲副作用增量a

因此,a++ < 10被評估。結果爲false10不小於10),但作爲評估該表達式的結果,a遞增,現在具有值11。在do while循環結束時,我們評估a++<=11。由於a當前的值爲11,因此該評估爲true。作爲評估表達式的結果,a增加到12

我們再次執行do while循環的主體。再次評估表達式a++ < 10。與之前一樣,結果爲false,但作爲評估表達式a的結果遞增到13

然後,我們再次評估a++ <= 11。結果爲false,因爲13不小於或等於11,並且a遞增一次

因此,當整個混亂結束時,a14

彙總:

  1. a最初10;
  2. do while進入循環
  3. a++ < 10進行評價時,現在a11
  4. a++ <= 11進行評價時,現在a12do while循環重複
  5. a++ < 10進行評價時,a現在13
  6. a++ <= 11被評估,a現在是14,do while環路退出。
+0

非常詳細的解釋。非常感謝。但爲什麼它停在14? – Deant

+0

@Deant:我認爲上面的解釋清楚地表明瞭 - 我們兩次評估「a ++ <10」和「a ++ <= 11」兩次,這意味着我們評估總共四次「a ++」;這有效地將'4'添加到'a'的初始值。 '14'不小於或等於'11',這就是爲什麼'do while'循環在第二次迭代後退出的原因。 –

+0

剛剛得到它。非常感謝。 – Deant