所以,我在阅读的代码中遇到了一个奇怪的行,我不知道为什么它会这样。
代码(我把声明等放在了与清晰性相关的地方,而且,正如您可能猜到的,UINT1是一个1字节无符号整数,INT2是一个2字节有符号整数):

#define Z 2
INT2 t;
UINT1 *x; //sent into the function as a pointer as in f( UINT1 *x )
INT2 y = 20; //declared as 0 first then some number is assigned (let's say 20)
t = (INT2) *(INT2 *) (x + y + Z);

我不明白的是,为什么要使用这种过于复杂的方式来铸造它,而这些方法中的一种也应该同样有效:
t = (INT2) (x + y + Z);
t = (INT2) *(x + y + Z);

为什么这么做?我对C比较陌生,可能遗漏了一些东西。

最佳答案

在没有上下文的情况下,不清楚这段代码到底是做什么的,但是这一行:

t = (INT2) *(INT2 *) (x + y + Z);

x上执行一些指针运算,然后将结果强制转换为指向INT2的指针(可能违反严格的别名btw),并取消对它的引用。
然后解引用的结果再次转换为INT2——这部分是多余的,解引用一个INT2 *已经得到一个INT2,因此它可以读取:
t = *(INT2 *)(x + y + Z);

另一方面,你的“简化”版本:
t = (INT2) (x + y + Z);

做一些完全不同且完全没有意义的事情:x上指针算法的结果地址在这一行中被转换为INT2

10-06 12:02