繁体   English   中英

运算符优先级和类型转换在这里如何工作

[英]How does operator precedence and typecasting work here

好的,所以我在这里编写指针的工作,并且不确定这段代码如何工作。

typedef struct linkedlist {
    void *obj;
    struct linkedlist *next;
} linkedlist;
linkedlist *p;

//some code here

int *newpointer = (*(int *)(p->next)->obj); //code chunk in question

如果我需要在p-> next所指向的结构中类型转换void指针'obj'(假设它已经存在)并将其复制到'newpointer'int指针,我是否正确?

int *newpointer = (*(int *)(p->next)->obj); //code chunk in question

如果我需要在p-> next所指向的结构中类型转换void指针'obj'(假设它已经存在)并将其复制到'newpointer'int指针,我是否正确?

不。编译器会告诉您的。 您也不需要所有这些括号:

int *newpointer = (int *)p->next->obj;

您正在尝试使用转换指针的取消引用值初始化指针newpointer ,这是一个错误。 海湾合作委员会说:

错误:从“ int”到“ int *”的无效转换

删除对取消引用运算符的调用:

int *newpointer = (int*) p->next->obj; // Also stripped unnecessary parentheses.

在C语言中,类型转换运算符的优先级低于成员访问运算符的优先级。 因此,

(int*)p->next->obj = (int*)(p->next->obj) = (int*)((p->next)->obj)

如果成员访问运算符的优先级更高,则可以使用:

int *newpointer = (int*)(p->next->obj);

由于它们不是,因此您可以省略所有的参数并使用:

int *newpointer = (int*)p->next->obj;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM