C代码(带逗号运算符)到 Delphi

xeufq47z  于 2022-11-04  发布在  其他
关注(0)|答案(1)|浏览(145)

下面的 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;     //<--?
dsf9zpds

dsf9zpds1#

在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代码,我将不得不打他们的屁股。

相关问题