【问题标题】:Does loop condition work even it gets zero while using pointer based condition?即使在使用基于指针的条件时循环条件为零,循环条件也能工作吗?
【发布时间】:2017-07-23 17:56:38
【问题描述】:

据我所知,for 循环具有这种结构“for(init;condition;increment)”并一直持续到条件不为零或不为真。现在,我遇到了这样的代码:

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 y\n");
        ch=getch();
    }
}

我对带有“ptr->next!=0”条件的 for 循环有一些理解问题,因为循环正在进行,即使“ptr->next”每次都为零,但据我所知,不应该。谁能帮我找到解释?

【问题讨论】:

  • 相信我ptr->next!=0 并不总是0。那不可能是问题。使用调试器看看会发生什么。
  • 我认为你应该用NULLs 替换零。
  • 你的 for 循环有一个尾随分号。为什么?
  • “据我所知,循环具有这种结构“for(init;condition;increment)”并一直持续到条件不为零或不为真。 - 这是三个循环语句之一。目前尚不清楚“直到条件不为零或不为真”是什么意思。在 C 中,非零值的计算结果为真。而for 循环是while 循环的语法糖。您会在每本 C 书籍中找到两者的解释。什么不清楚?我们不是“解释我在这里找到的代码”的网站。
  • 你怎么知道'ptr->next 为零'?你的调试器?

标签: c loops pointers data-structures linked-list


【解决方案1】:

尽管“ptr->next”每次都为零,但循环仍在继续,

不是真的。仅对于列表的最后一个元素为零。只要当前元素具有有效的nextfor 循环就会遍历列表,因此当循环终止时,ptr 指向最后一个元素。

此时,我们有

ptr->next=nw;

这会将最后一个节点(当前为 0)的 next 指针更改为指向新创建的节点。

顺便说一句,请注意这行缩进令人困惑 - 它像循环体一样进入一个块,但它不是 - for 循环后面有一个分号,即一个空语句,它是循环体(IOW,你有一个带有空体的for 循环,因为它所要做的一切都已经在增量部分完成了)。

ptr->next=nw; 无缘无故地在一个块中,它完全独立于循环体。如果您在此处打印了 next 值并添加了一些 printf,这可能就是您感到困惑的原因。

【讨论】:

  • 谢谢,我错过了:)
  • @Mahin 也是,整个循环很愚蠢-相反,只需要保留指向列表中 last 元素的指针,无需每次都重复从头开始。
猜你喜欢
  • 1970-01-01
  • 2014-03-30
  • 2020-04-29
  • 2012-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多