2013-07-15 36 views
18

請考慮下面的代碼,爲什麼將括號括在逗號分隔值列表中會改變分配?

int i; 

    i = 1,2,3,4,5; 
    printf("First time i = %d\n",i); 

    i = (1,2,3,4,5); 
    printf("Second time i = %d\n",i); 

輸出:

我第一次= 1

我第二次= 5


爲什麼括號使逗號操作取最後的價值和沒有括號它需要第一個價值?

在此先感謝。

+0

[這可有助於(http://en.wikipedia.org/wiki/Comma_o​​perator)。檢查這個頁面上的'Examples'標題。 –

+0

@Dayalrai,這不是一個幫助 – ar2015

+0

@ ar2015我可以清楚地看到答案在於_Examples_部從提供的鏈接其中'I =(A,B)'和'I = A,B'進行了討論。 –

回答

20

第一個相當於(i = 1),2,3,4,5;這意味着逗號不起作用。在使用括號使用它返回的「逗號分隔的列表」

的最後一個值這一切都是由於運算符優先級,您可以查看錶約here

+0

同意,但爲什麼最後的價值? –

+2

@pranitkothari因爲逗號具有最低的運算符優先級和括號組在一起。逗號運算符具有從左到右的關聯性。 – Rapptz

+0

清除了我的疑惑。 +1 –

4

賦值的優先級高於逗號,因此您在第一種情況下得到的結果。你可以在這裏找到整個operator precedence table

爲什麼括號使逗號運算符取最後一個值而沒有括號取其第一個值?

因爲括號用於覆蓋優先級。第一種情況隱含等價於:

(i = 1),2,3,4,5; 

逗號從左到右評估,最右邊的值是整個表達式的值。在這裏閱讀documentation

逗號運算符具有從左到右的關聯性。用逗號分隔的兩個表達式從左到右進行評估。左操作數總是被評估,並且在評估右操作數之前完成所有副作用。

8

這是由於運算符優先級和評估順序。 =結合比,和困難,我們可以弄清楚,下面兩個表達式是相同的:

i = 1,2,3,4,5 /* <- same as -> */ (i = 1),(2),(3),(4),(5) 

邊注:逗號操作是他們全部的「最弱」運營商


爲什麼逗號操作得到我們的名單的最後一個值?

說得簡單此符計算第一個操作數只丟棄它並移動到下一個,它結合左到右這意味着它會從左邊開始,並繼續朝行走正確的。


我在哪裏可以閱讀更多關於此主題的內容?

+1

+1提的運算符優先級 – junix

+1

+1尼斯解釋,但真的很抱歉,選擇花葯的答案。 –

5

由於=具有比,一個更高的優先級(其具有最低的),首先是相同

(i = 1),2,3,4,5; 

其分配到1ii = 1)然後評估表達式234,和5通過逗號運算符(整個表達式實際上導致5,這是不使用)。在第二個,

(1,2,3,4,5) 

括弧,因此它會=之前首先被評估。它的結果是5(最右邊的表達式;這是逗號運算符的行爲),然後將其分配給i

i = (1,2,3,4,5); 
    |   | 
    \---------\--- results in 5 then is assigned to i 

請參閱operator precedence Wikipedia article

相關問題