我在c中遇到了这个For循环,我很难理解它这是循环上下文:循环正在遍历链接列表
POINTER **prev=head, *curr, *next;
for(curr = *head; curr; prev = &curr->link, curr = curr->link)
据我所知,curr
将从列表的开头开始。什么是curr;
?这只是意味着当前指针不是NULL吗?通常在该部分中,它将类似于i < 5;
最后,prev = &curr->link, curr = curr->link
-我从来没有见过逗号分隔增量(如果是这样的话(,我也不明白那个部分在做什么。
有人能帮我打破这个循环,帮助我了解发生了什么吗?
什么是
curr;
?这只是意味着当前指针不是NULL吗?
正确。for
循环的第二个子句是控制表达式,只要控制表达式不等于0,循环就会继续。由于curr
是一个指针,因此只有当它是NULL指针时,它才会等于0。
最后,
prev = &curr->link, curr = curr->link
-我从未见过逗号分隔增量(如果是这样的话(,我也不明白这一部分在做什么。
for
循环第三个子句中的逗号是逗号运算符的一个实例。此运算符计算其左操作数,丢弃该操作数的值,然后计算右操作数。在这种情况下,使用逗号运算符可以在一个表达式中为两个变量赋值。
具体地,该表达式将prev
指针设置为指向当前节点的link
成员的地址,然后将curr
指针设置为指针指向列表中的下一个节点。prev
是指向指针的指针的原因可能是允许移除当前节点或在当前节点之前插入新节点,同时还允许潜在地更新*head
的特殊情况。
紧凑型,不是吗?美丽的
https://en.wikipedia.org/wiki/For_loop#1972:_C/C++
for (initialization; condition; increment/decrement)
statement
初始化
curr = *head;
在循环开始时执行一次。curr
是迭代器,它也从head
的任何点开始。
条件
curr;
如果curr
不是NULL
,则为True。如果curr
是NULL
,则为False(C中的一个特性,其中0
或NULL
等同于False,而不是0
或NULL
的任何东西等同于True(。在每次循环迭代开始时检查条件。如果为true,则循环再次循环。如果为False,则循环退出。
递增/递减
在这里你会遇到一个奇怪的逗号运算符:https://en.wikipedia.org/wiki/Comma_operator
循环的这一部分在循环迭代结束时执行,然后检查下一次迭代的Condition。使用逗号运算符,这里压缩了两个操作:
将prev
设置为curr
链接(这对我来说是有意义的,尽管我认为prev
在这里可能意味着其他东西(:
prev = &curr->link
现在将curr
设置为列表中的下一个链接:
curr = curr->link
这样就遍历了链接列表:
- 初始化:在
head
启动curr
- 条件:测试
curr
是否已到达末尾(即NULL
( - 回路
- 递增/递减:将
curr
移动到下一个链路;在prev
中保留上一个链接(什么是curr
( - 条件:
- 回路
- 增量/减量: