gpt4 book ai didi

c - While 循环内的优先级

转载 作者:行者123 更新时间:2023-11-30 19:01:22 24 4
gpt4 key购买 nike

我编写了一个链表程序,它接受按升序排列的值。我在程序中有一个 while 循环,对此我有一个问题。我没有输入完整的代码,它只是用于按升序插入的模块化函数。这里,x作为用户的输入,头节点被传递到函数中。现在,在 while 循环中,如果我交换条件,即将“x > temp->next->data”保留在前面并将“temp->next != NULL”移到后面,那么,如果我的输入序列类似于 (1, 2, 3, 4, 5),即已经按升序排列。

 list *insert(list *head, int x)
{
list *temp = head, *prev = temp, *temp2 = create();
temp2->data = x;
if(head == NULL || x < head->data)
{
temp2->next = head;
head = temp2;
}
else
{
while(temp->next != NULL && x > temp->next->data) //while(x > temp->next->data && temp->next != NULL)
{
temp = temp->next;
}
temp2->next = temp->next;
temp->next = temp2;
}
return head;
}

我认为是这样的,当我输入1时,它会转到if语句(考虑到头最初是空的)并且1被添加到列表中。然后,当我输入 2 并检查条件时,由于列表中只有一个元素,temp->next 为 NULL,并且 NULL->data 将给出错误。但是,如果条件符合上面的程序,它就可以工作。 while 循环是否优先考虑其内部的条件?

最佳答案

您看到的行为与 while 无关,而是与逻辑 AND 运算符 && 相关。

&& 运算符是“短路”运算符。这意味着,如果操作数的结果可以仅通过评估左操作数来确定,则根本不会评估右操作数。

在这种特定情况下,这是一件好事。如果 temp->next 为 NULL,则 && 的左操作数为 false,因此我们知道该运算符的结果为 false,因此不需要评估x > temp->next->data

但是,如果您要切换 && 的操作数:

x > temp->next->data && temp->next != NULL

然后对 temp->next->data 进行求值,而不检查 temp-next 是否为 NULL。这开启了取消引用 NULL 指针的可能性,该指针调用 undefined behavior .

关于c - While 循环内的优先级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57929462/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com