2010-12-04 5 views

答えて

9

コンマ演算子はシーケンスポイントです。各コンマ区切り式は左から右に評価されます。結果には、右オペランドの型と値があります。機能的には、あなたの例では(?ずっと読みやすい)と同等です:関数呼び出しでは

:ここ

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

は、標準コンマ演算子(6.5.17)を提供することをもう一つの例であります

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

関数は、値を有する 第そのうち3つの引数を有する5

ウィキペディアから
8

:CおよびCにおいて

++プログラミング言語、(トークンによって表される)コンマ演算子は、最初のオペランドを評価し、結果を破棄し、バイナリ演算子であり、次いで第2オペランドとリターンを評価しますこの値(とタイプ)。コンマ演算子は、C演算子の中で最も低い優先順位を持ち、シーケンスポイントとして機能します。

カンマトークンを演算子として使用することは、関数呼び出しと定義、変数宣言、列挙宣言などの区切り記号としての使用とは異なります。

この例では、2行目と3行目の動作が異なるのは、カンマ演算子が割り当てよりも優先順位が低いためです。

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

'i = a、b;'では、 'b'に何が起こっていますか?この場合、なぜ「b」と書くのでしょうか? – MichaelChirico

0

それが動作してはならないのはなぜ? pbufによってアドレス指定されたシーケンシャルメモリブロックに対して、%,to_hex(*pstr >> 4)to_hex(*pstr & 15)を設定します。同等のコードは次のようなものです:

else { 
    *pbuf = '%'; 
    *(pbuf + 1) = to_hex(*pstr >> 4); 
    *(pbuf + 2) = to_hex(*pstr & 15); 
    pbuf += 3; 
} 
関連する問題