2017-01-12 45 views
1

PROG 1:C程序設計 - 逗號中的操作員而循環

#include<stdio.h> 
int main() 
{ 
    int i=0; 
    while(i<=8,i++); 
    printf("%d",i); 
    return 0; 
    } 

PROG 2:

#include<stdio.h> 
int main() 
{ 
    int i=0; 
    while(i++,i<=8); 
    printf("%d",i); 
    return 0; 
} 

PROG 1的輸出爲1,而PROG 2是9.

有人可以解釋這裏發生了什麼。這兩個代碼如何不同?

回答

2

逗號運算符依次評估它的兩個參數,拋出結果,除了最後一個。最後評估的表達式確定整個表達式的結果。

i<=8,i++ - 這裏表達式的值是i++的值,它是i在遞增之前的值。它是0,所以循環立即終止。

i++,i<=8 - 這裏的表達式的值是0,只有當i被遞增到9

就個人的i<=8值:我認爲第二形式,而有點類似for循環對於代碼讀者來說,比實際的for循環更不清楚。

0

表達式分隔符運算符,強制從左到右評估,也是測序點

程序1:考慮i <= 8, i++。評估並丟棄i <= 8然後評估i++。整個表達式具有未增值的值i。由於i最初爲0,因此while循環在第一次迭代時終止。輸出將是i該單獨增加的值,即1。

PROG 2:i++被評估並棄去的結果,那麼i <= 8與自,值的評價i測序點。所以while循環運行,直到i <= 8不再是true與遞增值i。輸出將爲9.

0
while (condition) 
    statement 

語句重複執行。評估每個執行(迭代)條件之前。如果它是假的,while循環結束並繼續執行。

在這種情況下,聲明爲空。語句可以是以分號(;)結尾的單行代碼或用大括號({,})括起來的塊代碼代碼

因此,我們會持續評估條件,直到它產生錯誤。爲了理解發生了什麼,我們需要檢查逗號運算符的工作方式。 (注意,雖然逗號作爲一個字符可以用在C中的地方 - 我可以想到函數聲明,定義和調用 - 在這種情況下,逗號字符是條件的一部分,因此它作爲一個操作符。)

expression1 , expression2 

逗號運算符使表達式1先被評估,然後被表達式2,然後返回表達式2的值。我們將評估兩個操作數(i ++,i < = 8),並在右操作數解析爲真時繼續操作。

雖然通常我們使用條件來控制循環的執行,但在這種情況下,條件可能會有其他影響。在我們的情況下,變量i受到每個條件評估的影響。它增加了一個。

我們的例子只有條件操作數的順序不同,因此操作數結果真的控制了循環的執行。

我們先來看第二個例子。在這種情況下,我們有條件「我++,我< = 8」。這意味着每次評估我們首先增加i,然後檢查它是否小於或等於8.因此,在第一次評估條件時,我們將i從0增加到1並得出結論:1 < = 8,所以循環繼續。這樣構建的循環只能在我變成9時破壞,即。在第9次迭代。

現在至於第一個例子,條件是「i < = 8,++ i」。由於比較沒有副作用,因此我們可以按任意順序執行任意數量的比較,如果這是我們所做的唯一事情,那就是說,如果我們沒有按照比較結果的方式或順序執行任何其他操作,那些比較將毫無用處。與我們的情況一樣,我們評估i < = 8,其結果爲真或假,但我們沒有使用該值,只是繼續評估正確的操作數。所以我們的情況實際上等於「i ++」。

這是後增量的一元運算符。它返回我的價值,然後只增加一個。 (所有的保證是這個順序,當我得到提高時,實際上是一個複雜的問題,並不總是在標準問題上決定的,除非我錯了)。所以會發生什麼是我們首先檢查我是否是真的,然後,無論如何,我們增加一個,然後打破循環或繼續。

在C中沒有真或假的值,沒有布爾類型。如果整數具有非零值,則認爲它們爲真。

因此,第一次評估「i ++」時,我們得到0,這是錯誤的。這意味着循環被打破,甚至沒有一次迭代。然而,「i ++」的評估使它增加了一個,所以當我們完成while循環時,我已經是1.