2010-07-30 181 views
4

下面的代碼段得到32的輸出,我有點困惑爲什麼?逗號運算符和賦值運算符 - 返回值

int i=(j=4,k=8,l=16,m=32); printf(「%d」, i); 
+0

值得一提的是,逗號運算符有點不受歡迎。它允許一些有用的構造,但它通常對學習者來說是一個驚喜和WTF。 – Steve314 2010-07-30 08:53:24

回答

12

從第一組圓括號開始讀取。

逗號運算符隨後評估幾個表達式中的每一個。它返回最後一個表達式的返回值 - 在本例中,它是32,因爲賦值的返回值是分配的值。

http://en.wikipedia.org/wiki/Comma_operator

4
int i=(j=4,k=8,l=16,m=32); printf(「%d」, i); // Will give you 32 
int i=(j=4,k=8,l=16); printf(「%d」, i); // Will give you 16 
int i=(j=4,k=8,l=16,m=32,n=64); printf(「%d」, i); // Will give you 64 

看到這個模式?

基本上,i被設置爲無論大括號中最後一個賦值的值是多少,因爲,運算符將按順序評估每個賦值,但會返回上述情況中最後一次賦值的值。

更一般地,,運算符(comma operator)將按順序評估一系列表達式並返回最後一個表達式的值。因此,在您的情況下,i正被賦予大括號中最後一個賦值的值(因爲賦值的返回值是正在賦值的值),即爲32.

4

comma operator爲左關聯。

它評估,隨後通過j=4k=8,隨後l=16最後m=32並返回32.因此,我得到的32值。

2

換句話說,括號中的任何內容首先從左到右進行評估;和最右邊的表達式返回作爲支架的輸出結果INT I得到十進制值32

0

不是一個真正的「答案」,但應該指出的是,主要使用逗號運算符將在多個語句無效的上下文中依次評估帶有副作用的表達式,如函數調用,賦值等。最重要的用途是在你希望整個宏「返回一個值」但執行多個操作的宏中。唯一的其他方法是使用gcc ({ /* multiple statements here */ })擴展名或讓宏只需調用static/static inline函數。

另一個經常使用我覺得逗號操作符與for聲明:

for (n=cnt; n; n--, d++, s++) 

,當我有一個if語句需要做兩個緊密相連的操作,我不想要的視覺括號的雜波:

if (condition) prefix="0x", len=2; 

在這些後面的用途中,逗號運算的結果的值不是特別有用,所以也沒有那麼重要了,這可能是令人困惑至C初學者。