C-为什么必须将NULL与进行比较?

C-为什么必须将NULL与进行比较?,c,linked-list,C,Linked List,我很好奇为什么当我迭代遍历链表时,我必须执行while(list!=NULL)而不是while(!list)。我认为NULL等于零或false 评论:当(!list)尝试执行时,我的程序似乎总是会崩溃,但前者永远不会。每个节点都包含一个指向一段数据的空指针和一个指向下一个节点的指针。在大多数情况下,这是样式的问题。与NULL的比较更加明确 如上所述,if(ptr!=NULL)相当于if(ptr)在大多数情况下,这是风格的问题。与NULL的比较更加明确 如上所述,if(ptr!=NULL)相当于i

我很好奇为什么当我迭代遍历链表时,我必须执行
while(list!=NULL)
而不是
while(!list)
。我认为NULL等于零或false


评论:当(!list)尝试执行
时,我的程序似乎总是会崩溃,但前者永远不会。每个节点都包含一个指向一段数据的空指针和一个指向下一个节点的指针。

在大多数情况下,这是样式的问题。与
NULL
的比较更加明确


如上所述,
if(ptr!=NULL)
相当于
if(ptr)

在大多数情况下,这是风格的问题。与
NULL
的比较更加明确

如上所述,
if(ptr!=NULL)
相当于
if(ptr)
而(list!=NULL)
而(!list)
不同。他们是对立的!当然,您的程序会崩溃,它会尝试取消引用
NULL
指针

while(list!=NULL)
while(list)
while(list!=NULL)
while(!list)
不同。他们是对立的!当然,您的程序会崩溃,它会尝试取消引用
NULL
指针



while(list!=NULL)
while(list)

在风格上,两者的结果是相同的。第一点对读者来说更清楚。@nos当我尝试
时,我的程序似乎总是崩溃!空
。它是一个有效的列表,其中每个节点都包含一个指向一段数据的空指针和一个指向下一个节点的指针。@nos我所做的就是遍历链表。每次执行
list=list->next
。那我就没有主意了。。。特别是因为它只对其中一个有效,而对另一个无效<代码>!NULL
为1,因此您几乎总是收到SEGFULT,因为在大多数系统中,1不是有效地址。您将从这两个地址获得相同的结果—风格问题。第一点对读者来说更清楚。@nos当我尝试
时,我的程序似乎总是崩溃!空
。它是一个有效的列表,其中每个节点都包含一个指向一段数据的空指针和一个指向下一个节点的指针。@nos我所做的就是遍历链表。每次执行
list=list->next
。那我就没有主意了。。。特别是因为它只对其中一个有效,而对另一个无效<代码>!NULL为1,因此您几乎总是收到SEGFULT,因为1在大多数系统上不是有效地址。这是不正确的。您将NULL宏与NULL指针混合在一起。NULL总是
0
(void*)0
@我在谷歌上搜索了一下。是的,那是我知识上的一个缺口。我将删除此部分。@Lundin
NULL
宏可以是
0
(void*)0
。然而,C规范并没有将其定义为只有这两个。其他的可能包括
((void*)0)
(-0)
((intptr\u t)0)
@chux My bad,出于某种原因,我以为你写了
(intptr\u t*)
。你是对的,我将删除评论。这是不正确的。您将NULL宏与NULL指针混合在一起。NULL总是
0
(void*)0
@我在谷歌上搜索了一下。是的,那是我知识上的一个缺口。我将删除此部分。@Lundin
NULL
宏可以是
0
(void*)0
。然而,C规范并没有将其定义为只有这两个。其他的可能包括
((void*)0)
(-0)
((intptr\u t)0)
@chux My bad,出于某种原因,我以为你写了
(intptr\u t*)
。你说得对,我会删除评论。当你在地牢里呆了几天试图让同样的功能正常工作时,你开始忘记基本的事情。我希望这有助于今后从事与我同样事业的同志。谢谢。令人印象深刻的是,OP、2位评论者和3位对这些评论者的投票都忽略了这2个代码片段具有相反的功能。(如果我没有先读这个答案的话,我自己可能会错过它。)我认为这是由于用
比较两个语句时的混乱造成的在它们中。最好使用
while(list)
。或者在代码需要执行相反操作时使用
while(list==NULL)
。两者都不使用
。当你在地牢里呆上几天试图让同样的功能正常工作时,你就会开始忘记一些基本的事情。我希望这有助于今后从事与我同样事业的同志。谢谢。令人印象深刻的是,OP、2位评论者和3位对这些评论者的投票都忽略了这2个代码片段具有相反的功能。(如果我没有先读这个答案的话,我自己可能会错过它。)我认为这是由于用
比较两个语句时的混乱造成的在它们中。最好使用
while(list)
。或者在代码需要执行相反操作时使用
while(list==NULL)
。两者都不使用