据我所知,for
循环具有这种结构"for(init;条件;递增(",并继续,直到条件不为零或为真。现在,我遇到了这样的代码:
struct node
{
int no;
struct node *next;
};
struct node *first;
void creatlist()
{
char ch='y';
struct node *ptr,*nw;
while(ch!='n')
{
printf("nEnter item in list");
nw=(struct node*)malloc(sizeof(struct node));
scanf("%d",&nw->no);
nw->next=0;
if(first==0)
{
first=nw;
}
else
{
for(ptr=first ;ptr->next!=0;ptr=ptr->next);
{
ptr->next=nw;
}
}
printf("nDo you want to countinue yn");
ch=getch();
}
}
我对带有"ptr->next!=0"条件的 for 循环有一些理解问题,因为即使"ptr->next"每次都是零,循环仍在继续,但根据我所知,它不应该是。谁能帮我找到解释?
因为循环仍在继续,即使"ptr->next"每次都是零,
没有。仅列表的最后一个元素为零。只要当前元素具有有效的next
,for
循环就会遍历列表,因此当循环终止时,ptr
指向最后一个元素。
在这一点上,我们有
ptr->next=nw;
这会将最后一个节点(当前为 0(的next
指针更改为指向新创建的节点。
顺便说一下,请注意,这一行令人困惑地缩进了 - 它变成了一个块,就好像它是循环体一样,但事实并非如此 -for
循环后面有一个分号,即一个空语句,这是循环体(IOW,你有一个带有空体的for
循环,因为它所要做的就是在增量部分中完成(。
ptr->next=nw;
无缘无故地处于一个块中,它完全独立于环体。如果您在此处打印next
值添加一些printf
,这可能是您感到困惑的原因。