2010-12-04 23 views

回答

9

逗號運算符是一個序列點:每個逗號分隔的表達式從左到右計算。結果具有右操作數的類型和值。在功能上,你的例子是相當於(更多可讀?):

else 
{ 
    *pbuf++ = '%'; 
    *pbuf++ = to_hex(*pstr >> 4); 
    *pbuf++ = to_hex(*pstr & 15); 
} 

下面是另一個例子,該標準規定了逗號(6.5.17):

在函數調用

f(a, (t=3, t+2), c) 

功能有三個參數,所述第二 其具有值5

8

維基百科:

在C和C++編程語言中,逗號(令牌表示,)是評價其第一操作數和丟棄結果,然後二進制運算符計算第二操作數並返回這個值(和類型)。逗號運算符具有任何C運算符的最低優先級,並充當序列點。

逗號令牌作爲操作符的使用與其在函數調用和定義,變量聲明,枚舉聲明和類似構造中的用法截然不同,它用作分隔符。

在此示例中,第二行和第三行之間的不同行爲是由於逗號運算符的優先級低於賦值。

int a=1, b=2, c=3, i; // comma acts as separator in this line, not as an operator 
i = (a, b);    // stores b into i        ... a=1, b=2, c=3, i=2 
i = a, b;    // stores a into i. Equivalent to (i = a), b;  ... a=1, b=2, c=3, i=1 
i = (a += 2, a + b); // increases a by 2, then stores a+b = 3+2 into i ... a=3, b=2, c=3, i=5 
i = a += 2, a + b;  // increases a by 2, then stores a = 5 into i  ... a=5, b=2, c=3, i=5 
i = a, b, c;   // stores a into i        ... a=5, b=2, c=3, i=5 
i = (a, b, c);   // stores c into i        ... a=5, b=2, c=3, i=3 

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

+0

在`我= a,b;`,發生了什麼`b`?爲什麼會在這種情況下寫`b`? – MichaelChirico 2017-07-22 15:40:25

0

爲什麼它不應該工作?它將%,to_hex(*pstr >> 4),to_hex(*pstr & 15)設置爲由pbuf尋址的順序存儲器塊。等效代碼可能如下:

else { 
    *pbuf = '%'; 
    *(pbuf + 1) = to_hex(*pstr >> 4); 
    *(pbuf + 2) = to_hex(*pstr & 15); 
    pbuf += 3; 
}