C语言 如果输入的值大于列表的最后一个元素,则跳过整个程序并退出,方法是反转while块的条件,使其正常运行

jogvjijk  于 2022-12-02  发布在  其他
关注(0)|答案(1)|浏览(83)

程序完全退出

while ((temp->x < new_node->x)&&(temp != NULL))

但当编写为

while((temp!=NULL) &&(temp->x < new_node->x))

这是我的代码。

Node *insert(Node *head)
{
    Node *new_node = (Node *)malloc(sizeof(Node));
    new_node->next = NULL;
    printf("\nEnter x: ");
    scanf("%d", &new_node->x);
    if (head == NULL)
        return new_node;
    else
    {
        Node *prev = NULL, *temp = head;
        while ((temp->x < new_node->x)&&(temp != NULL))  // but, ((temp!=NULL) &&(temp->x < new_node->x)) runs 
        {
            prev = temp;
            temp = temp->next;
        }
        new_node->next = temp;
        if (prev == NULL) // Node needs to insert at beginning to maintain the sorting of Linked List
            return new_node;
        prev->next = new_node;
        return head;
    }
}
kx7yvsdv

kx7yvsdv1#

循环中的条件或包含&&if语句严格从左到右求值,除非LHS求值为true,否则不会对RHS求值。您有:

while ((temp->x < new_node->x) && (temp != NULL))

条件temp->x < new_node->xtemp != NULL之前求值。但是,如果temp为空,则在大多数系统上第一次比较将失败,因为通过空指针访问是未定义的行为,通常会导致分段错误。
相比之下,当你写:

while ((temp != NULL) && (temp->x < new_node->x))

代码首先检查空指针,如果指针为空,则不计算RHS条件,因此避免了崩溃。
这样做的目的是在试图通过指针访问数据之前检查指针是否为空。显然,如果指针不能为空,则在使用之前不需要测试它。有时,如果指针不应该为空,则Assert指针不为空可能是有益的:

assert(temp != NULL);

相关问题