前情提要:今天用C++写数据结构代码,写一个while循环,p是一个链表指针,有两个条件,用&&
连接,如下:
while(p->data != data && p != NULL)
然后发现第二个条件p != NULL
被标黄,显示Condition is always true when reached
,查了一下才发现&&
是短路与。
知识搜罗:
&
:逻辑与;|
:逻辑或
&&
:短路与;||
:短路或
- 逻辑运算符都要求两边的式子是布尔类型,且逻辑运算符最终的运算结果也是一个布尔类型,短路与/或和逻辑与/或最终的运算结果是相同的,只不过短路与/或存在短路现象;
- 在短路或的情况下,只要第一个表达式的值为true,整个式子就为true,在短路与的情况下,只要第一个表达式的值为false,那么整个式子就为false。
问题解决:
假如采用上面的写法,如果存在p->data
那么一定有p != NULL
,就没有判断第二个条件的必要;
而如果p==NULL
那么p->data
根本不存在,这个寻找p->data
的操作会出现问题(因为p指向空,何来p->data
,根本不存在,空指针异常),可能导致内存泄漏,报错SIGSEGV (Segmentation fault)
,故要先判断是否p == NULL
,再去找p->data
,本质上是一个执行先后顺序的问题,所以正确的写法应该是:
while(p != NULL && p->data != data)
解决!
标签:逻辑,true,短路,&&,Debug,NULL,data From: https://blog.csdn.net/weixin_51193374/article/details/143721154本专栏是记录一些debug时学到的知识/发现的问题,用以自勉(乐),每天debug一下,头发又少一点~