Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C While循环内的优先级_C_While Loop - Fatal编程技术网

C While循环内的优先级

C While循环内的优先级,c,while-loop,C,While Loop,我为链表编写了一个程序,它接受升序的值。我在程序中有一个while循环,对此我有一个问题。我并没有输入完整的代码,它只是以升序插入的模块化函数。这里,x作为来自用户的输入,head节点被传递到函数中。现在,在while循环中,如果我交换条件,即保持x>temp->next->data在前面,移动temp->next!=空,那么,如果我的输入序列像1,2,3,4,5,也就是说,已经是升序了,我就得到了一个错误 list *insert(list *head, int x) { list

我为链表编写了一个程序,它接受升序的值。我在程序中有一个while循环,对此我有一个问题。我并没有输入完整的代码,它只是以升序插入的模块化函数。这里,x作为来自用户的输入,head节点被传递到函数中。现在,在while循环中,如果我交换条件,即保持x>temp->next->data在前面,移动temp->next!=空,那么,如果我的输入序列像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时,它会转到如果statementHead最初是空的,并且1被添加到列表中。然后,当我输入2并检查条件时,由于列表中只有一个元素,temp->next为NULL,NULL->data将给出一个错误。但是,如果条件符合上述程序,则它可以工作。是不是while循环优先于自身的条件

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

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

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

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


然后计算temp->next->data,而不检查temp next是否为NULL。这打开了取消引用调用的空指针的可能性。

&&是短路。也就是说,如果a和b中的a为false,则不会计算b。请记住,逻辑运算符| |和&&使用。如果temp->next为NULL,则调用temp->next->data将导致错误。在尝试访问temp->next->数据之前,必须检查temp->next是否为NULL。
x > temp->next->data && temp->next != NULL