[英]Comma operators and assignment operators - return values
以下代碼段得到32的輸出,我有點混淆為什么?
int i=(j=4,k=8,l=16,m=32); printf(“%d”, i);
開始在第一組括號內閱讀。
逗號運算符隨后會計算幾個表達式中的每一個。 它返回最后一個表達式的返回值 - 在本例中,它是32,因為賦值的返回值是賦值。
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
被設置為大括號中最后一個賦值的值,因為,
運算符將按順序計算每個賦值,但返回上面案例中最后一個賦值的值。
更一般地, ,
操作符( 逗號運算符 )將評估一系列序列表達式並返回最后一個表達式的值。 所以在你的情況下, i
被分配了最后在大括號中分配的值(因為從賦值返回,是被賦值的值),即32。
逗號運算符是左關聯的。
它評估j=4
然后是k=8
,接着是l=16
,最后m=32
並返回32.因此我得到值32
。
換句話說,括號中的任何內容首先從左到右進行評估; 並且最右邊的表達式作為括號的輸出返回 ,因為結果int i得到小數值32。
不是真正的“答案”,但應該注意的是,逗號運算符的主要用途是在多個語句無效的上下文中依次計算具有副作用的表達式,例如函數調用,賦值等。 最重要的用途是在宏中,您希望整個宏“返回一個值”但執行多個操作。 實現此目的的唯一其他方法是使用gcc ({ /* multiple statements here */ })
擴展或讓宏只調用static
/ static inline
函數。
我為逗號運算符找到的另一個常用用法是使用for
語句:
for (n=cnt; n; n--, d++, s++)
當我有一個if
語句需要做兩個緊密連接的操作時,我不想要大括號的視覺混亂:
if (condition) prefix="0x", len=2;
在后面這些用法中,逗號運算符的結果值並不是特別有用,因此它對於C初學者來說可能會讓人感到困惑並不重要。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.