請考慮下面的代碼,爲什麼將括號括在逗號分隔值列表中會改變分配?
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
爲什麼括號使逗號操作取最後的價值和沒有括號它需要第一個價值?
在此先感謝。
請考慮下面的代碼,爲什麼將括號括在逗號分隔值列表中會改變分配?
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
爲什麼括號使逗號操作取最後的價值和沒有括號它需要第一個價值?
在此先感謝。
賦值的優先級高於逗號,因此您在第一種情況下得到的結果。你可以在這裏找到整個operator precedence table。
爲什麼括號使逗號運算符取最後一個值而沒有括號取其第一個值?
因爲括號用於覆蓋優先級。第一種情況隱含等價於:
(i = 1),2,3,4,5;
逗號從左到右評估,最右邊的值是整個表達式的值。在這裏閱讀documentation。
逗號運算符具有從左到右的關聯性。用逗號分隔的兩個表達式從左到右進行評估。左操作數總是被評估,並且在評估右操作數之前完成所有副作用。
這是由於運算符優先級和評估順序。 =
結合比,
和困難,我們可以弄清楚,下面兩個表達式是相同的:
i = 1,2,3,4,5 /* <- same as -> */ (i = 1),(2),(3),(4),(5)
邊注:逗號操作是他們全部的「最弱」運營商
爲什麼逗號操作得到我們的名單的最後一個值?
說得簡單此符計算第一個操作數只丟棄它並移動到下一個,它結合左到右這意味着它會從左邊開始,並繼續朝行走正確的。
我在哪裏可以閱讀更多關於此主題的內容?
+1提的運算符優先級 – junix
+1尼斯解釋,但真的很抱歉,選擇花葯的答案。 –
由於=
具有比,
一個更高的優先級(其具有最低的),首先是相同
(i = 1),2,3,4,5;
其分配到1
i
(i = 1
)然後評估表達式2
,3
,4
,和5
通過逗號運算符(整個表達式實際上導致5
,這是不使用)。在第二個,
(1,2,3,4,5)
括弧,因此它會=
之前首先被評估。它的結果是5
(最右邊的表達式;這是逗號運算符的行爲),然後將其分配給i
。
i = (1,2,3,4,5);
| |
\---------\--- results in 5 then is assigned to i
[這可有助於(http://en.wikipedia.org/wiki/Comma_operator)。檢查這個頁面上的'Examples'標題。 –
@Dayalrai,這不是一個幫助 – ar2015
@ ar2015我可以清楚地看到答案在於_Examples_部從提供的鏈接其中'I =(A,B)'和'I = A,B'進行了討論。 –