【问题标题】:C - when condition weird issueC - 当条件奇怪的问题
【发布时间】:2020-12-14 23:41:59
【问题描述】:

所以我试图实现一个函数来检测链表中的循环,基本上,我一直在苦苦挣扎,直到我意识到我只需要切换 2 个条件。

此代码不起作用,它会产生 SIGSEV 错误:

bool has_cycle(SinglyLinkedListNode* head) {

    struct SinglyLinkedListNode *slow = head;
    struct SinglyLinkedListNode *fast = head;
    
    while(slow && fast->next && fast)
    {
        fast = fast->next->next;
        slow = slow->next;
        
        if(fast == slow)
        {
            return 1;
        }
    }
    
    return 0;

}

但是当我将while(slow && fast->next && fast) 切换为while(slow && fast && fast->next) 时,它可以工作。为什么?

【问题讨论】:

  • while(slow && fast && fast->next)Google 用于“短路评估”

标签: c data-structures while-loop linked-list


【解决方案1】:

假设fastNULL。尝试评估 fast->next 会导致您的代码崩溃。所以你需要先检查fast是不是NULL

由于这三个条件由 AND 改变,只要其中一个是 false,整个结果就是 false。因此评估停止,NULL 永远不会被取消引用。这称为“短路评估”。

出于这个原因,C 和 C++ 中的常见模式类似于 if (foo && (foo->bar == baz))

【讨论】:

    【解决方案2】:

    您的条件中的fast 正在测试fast 不为空,如果确定不为空,则测试fast->next 条件。如果你先测试fast->nextfast 有可能为空,这就是你得到 seg 错误的原因。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-03
      • 2012-10-08
      • 2011-05-16
      • 2016-02-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多