Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 运算符优先级和类型转换在这里是如何工作的_C - Fatal编程技术网

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

C 运算符优先级和类型转换在这里是如何工作的,c,C,好的,我在这里写指针,我不确定这段代码是如何工作的 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(假设它已经存在)指向的结构中

好的,我在这里写指针,我不确定这段代码是如何工作的

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(假设它已经存在)指向的结构中键入空指针'obj',并将其复制到'newpointer'int指针,我做得对吗

int *newpointer = (*(int *)(p->next)->obj); //code chunk in question
如果我需要在p->next(假设它已经存在)指向的结构中键入空指针'obj',并将其复制到'newpointer'int指针,我做得对吗

int *newpointer = (*(int *)(p->next)->obj); //code chunk in question
不,编译器会告诉你的。您也不需要所有这些括号:

int *newpointer = (int *)p->next->obj;
如果我需要在p->next(假设它已经存在)指向的结构中键入空指针'obj',并将其复制到'newpointer'int指针,我做得对吗

int *newpointer = (*(int *)(p->next)->obj); //code chunk in question
不,编译器会告诉你的。您也不需要所有这些括号:

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

您正在尝试使用已转换指针的解引用值初始化指针
newpointer
,这是一个错误。Gcc表示:

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

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

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

您正在尝试使用已转换指针的解引用值初始化指针
newpointer
,这是一个错误。Gcc表示:

错误:从“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;

在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;

欢迎来到堆栈溢出。请尽快阅读这一页。你有没有咨询过你的编译器关于你所做的是否合适?你的调试器呢?为什么存储的是
void*
而不是
int*
?为什么你用C和C++来双重标记?这看起来更像是C++代码,因为C++没有真正需要的<代码> Type文件< /C>。将
int
分配给
int*
应该会生成编译警告。你好,Jon,我刚刚阅读了关于页面。我知道我在那里做了什么。只是我有一个链表,其中包含指向任何数据类型所需的元素。这意味着我必须使用一个空指针,以方便类型转换。我知道空投是不好的。只是设计规格是这样的。我还将继续使用调试器。从现在起,我们将更加勤奋。有时,设计是给定的,无论是好是坏。请记住不要用C和C++来双重标记。除此之外,如果你已经学会了,那很好;这就是我们来这里的目的。欢迎来到堆栈溢出。请尽快阅读这一页。你有没有咨询过你的编译器关于你所做的是否合适?你的调试器呢?为什么存储的是
void*
而不是
int*
?为什么你用C和C++来双重标记?这看起来更像是C++代码,因为C++没有真正需要的<代码> Type文件< /C>。将
int
分配给
int*
应该会生成编译警告。你好,Jon,我刚刚阅读了关于页面。我知道我在那里做了什么。只是我有一个链表,其中包含指向任何数据类型所需的元素。这意味着我必须使用一个空指针,以方便类型转换。我知道空投是不好的。只是设计规格是这样的。我还将继续使用调试器。从现在起,我们将更加勤奋。有时,设计是给定的,无论是好是坏。请记住不要用C和C++来双重标记。除此之外,如果你已经学会了,那很好;这就是我们来这里的目的。如果可以的话,我会+1(这里的新手)。我真的应该更加关注那些编译器消息。@solaremperor您应该完全关注它们。编写良好的程序根本不会生成任何编译器消息。追踪你得到的每一个,问问你自己为什么会这样。如果可以的话,我会+1(这里的新手)。我真的应该更加关注那些编译器消息。@solaremperor您应该完全关注它们。编写良好的程序根本不会生成任何编译器消息。追踪你得到的每一个人,问问自己为什么是你造成的。