それが動作しないのはなぜルーチンカンマ区切りの割り当てとは何ですか?
else
*pbuf++ = '%', *pbuf++ = to_hex(*pstr >> 4), *pbuf++ = to_hex(*pstr & 15);
に気づきましたか?
どうしますか?
それが動作しないのはなぜルーチンカンマ区切りの割り当てとは何ですか?
else
*pbuf++ = '%', *pbuf++ = to_hex(*pstr >> 4), *pbuf++ = to_hex(*pstr & 15);
に気づきましたか?
どうしますか?
コンマ演算子はシーケンスポイントです。各コンマ区切り式は左から右に評価されます。結果には、右オペランドの型と値があります。機能的には、あなたの例では(?ずっと読みやすい)と同等です:関数呼び出しでは
ウィキペディアから:ここ
else { *pbuf++ = '%'; *pbuf++ = to_hex(*pstr >> 4); *pbuf++ = to_hex(*pstr & 15); }
は、標準コンマ演算子(6.5.17)を提供することをもう一つの例であります
f(a, (t=3, t+2), c)
関数は、値を有する 第そのうち3つの引数を有する5
: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
それが動作してはならないのはなぜ? 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;
}
'i = a、b;'では、 'b'に何が起こっていますか?この場合、なぜ「b」と書くのでしょうか? – MichaelChirico