2

Cでの次の同等のDelphiコードは何ですか?

int32 *P;
int32 c0, c1, i, t;
uint8 *X;

t = P[i], c0 = X[t], c1 = X[t + 1];

率直に言って、コンマ演算子は私を混乱させます。次はひどく間違っていますか?

{$POINTERMATH ON}
var P: ^Int32; c0, c1, i, t: Int32; X: ^UInt8;

t:= P[i];   //<--?
c0:= X[t];
c1:= X[t+1];
t:= c1;     //<--?
4

1 に答える 1

14

Cのコンマ演算子は、可能な限り低い優先順位を持ちます。したがって、ステートメントは次と同等です。

(t = P[i]), (c0 = X[t]), (c1 = X[t + 1]);

次に、左から右に評価されます。したがって、次のようになります。

t = P[i];
c0 = X[t];
c1 = X[t + 1];

ただし、次のようなことをした場合:

z = (a = b, c = d);

次に、これと同等になります。

a = b;
c = d;
z = c;

コンマ演算子はその最終オペランドを「返す」ためです。

また、各コンマはシーケンスポイントであるため、このようなものは明確に定義されていることも指摘しておく必要があります。

i = i + 1, i++, --i;

これはそうではありませんが:

i = i + i++ - --i;


言うまでもなく、最初のコードスニペットのような本番Cコードを誰かが書いた場合、私はそれらをたたく必要があります。

于 2012-02-08T08:58:33.713 に答える