繁体   English   中英

While循环中的优先级

[英]Precedence inside While loop

我为链表编写了一个程序,该程序以升序接受值。 我在程序中有一个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时,将转到是否声明(考虑头最初为空)并将1添加到列表中。 然后,当我输入2并检查条件时,由于列表中只有一个元素,因此temp-> next为NULL,并且NULL-> data将给出错误。 但是,如果条件符合上面的程序,它将起作用。 是while循环优先考虑其内部条件吗?

您看到的行为与while无关while但与逻辑AND运算符&&无关。

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

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

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

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

然后,在不检查temp-next是否为NULL temp-next评估temp->next->data 这打开了取消引用调用未定义行为的NULL指针的可能性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM