我对发布列表func中的for循环有疑问。 (头部是假人,所以我们不需要释放它)。我不明白:
next = next?
参与循环。它实际上做了什么,为什么只是
next?
还不够?这是代码:
typedef struct NODE {
int num;
struct NODE* next;
} Node;
void release_list(Node* head) {
Node* next = head->next ? head->next->next : NULL;
for( Node* curr = head->next;
curr != NULL;
curr = next, next = next? next->next : NULL) {
free(curr);
}
}
答案 0 :(得分:3)
部分:
curr = next, next = next? next->next : NULL
是for
循环的第三部分,这意味着它将在每次结束时执行。它相当于:
curr = next;
if (next) //if next != NULL
next = next->next;
else
next = NULL;
代码试图实现的是检查所有指针,以避免尝试访问最后一个元素NULL->next
,这个元素将不存在。
通常,if
语句如下所示:
if (a > b) {
result = x;
} else {
result = y;
}
可以改写为以下语句:
result = a > b ? x : y;
如this link所示。
您可以详细了解Ternary operator in C。
答案 1 :(得分:3)
三元运算符?:
的优先级高于赋值=
。
代码相当于:
next = (next? next->next : NULL)
或者:
if(next != NULL)
next = next->next;
else
next = NULL;
代码的一点是避免在最后一个元素上意外地执行NULL->next
。
答案 2 :(得分:1)
for循环可以重写为while循环,如下所示:
Node* curr = head->next;
while(curr != NULL)
{
free(curr);
curr = next;
if (next != NULL)
{
next = next->next;
}
else
{
next = NULL;
}
}
next = next?next->next:NULL
的意图是将next
指针移动到下一个节点。
答案 3 :(得分:0)
它是?:
运算符的一部分。构造是cond?consequent:alternative
。如果cond
计算true
,则计算表达式consequent
并且它的值是表达式的结果,否则计算alternative
并且它的值是表达式的结果。 consequent
和alternative
的类型应该相同。
因此next ? next->next : NULL
表示next->next
next
不是NULL
而NULL
表示next
是NULL
。
此外,,
运算符意味着按顺序计算表达式。这是最低优先级的运算符,这意味着for
子句的最后一个意味着首先评估curr = next
然后next = next ? next->next : NULL
。
答案 4 :(得分:0)
这是 obscuation 的示例,几乎可以肯定,代码是尝试删除链表中的所有节点失败。更快,更易读的方法是:
void release_list (Node* head)
{
while(head != NULL)
{
Node* tmp = head;
head = head->next;
free(tmp);
}
}