理解c中棘手的for循环

时间:2017-02-08 08:04:32

标签: c for-loop

我对发布列表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);
     }
}

5 个答案:

答案 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指针移动到下一个节点。

请参阅:The ternary (conditional) operator in C

答案 3 :(得分:0)

它是?:运算符的一部分。构造是cond?consequent:alternative。如果cond计算true,则计算表达式consequent并且它的值是表达式的结果,否则计算alternative并且它的值是表达式的结果。 consequentalternative的类型应该相同。

因此next ? next->next : NULL表示next->next next不是NULLNULL表示nextNULL

此外,,运算符意味着按顺序计算表达式。这是最低优先级的运算符,这意味着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); 
  }
}