Delphi的C代码(用逗号运算符)

Phi*_*hiS 2 c delphi comma

在C中,以下等效的Delphi代码是什么:

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

t = P[i], c0 = X[t], c1 = X[t + 1];
Run Code Online (Sandbox Code Playgroud)

坦率地说,逗号操作员让我感到困惑.以下是非常错误的吗?

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

t:= P[i];   //<--?
c0:= X[t];
c1:= X[t+1];
t:= c1;     //<--?
Run Code Online (Sandbox Code Playgroud)

Oli*_*rth 14

C中的逗号运算符具有可能的最低优先级.所以你的陈述相当于:

(t = P[i]), (c0 = X[t]), (c1 = X[t + 1]);
Run Code Online (Sandbox Code Playgroud)

然后从左到右进行评估.所以它相当于:

t = P[i];
c0 = X[t];
c1 = X[t + 1];
Run Code Online (Sandbox Code Playgroud)

但是,如果你做过这样的事情:

z = (a = b, c = d);
Run Code Online (Sandbox Code Playgroud)

那么它将等同于:

a = b;
c = d;
z = c;
Run Code Online (Sandbox Code Playgroud)

因为逗号运算符"返回"它的最终操作数.

我还应该指出,因为每个逗号都是一个序列点,所以这样的东西是明确定义的:

i = i + 1, i++, --i;
Run Code Online (Sandbox Code Playgroud)

这不是:

i = i + i++ - --i;
Run Code Online (Sandbox Code Playgroud)


几乎不言而喻:如果有人像你的第一个代码片段一样编写了生产C代码,我就不得不打他们.

  • 您的脚注会因您的头像而变得更好.:-) (2认同)