问题描述
我试图检测链表中的循环。当我放置条件 while(pointer!=NULL && pointer->next!=NULL)
时,它运行良好,提供了所有理想的输出。但是当我反转条件时,它在不存在循环时停止显示输出。就像当一个循环存在时,它给出 true 作为输出,但当它不存在时,它不给出任何输出。所以,我想知道这背后的原因是什么。
解决方法
因为条件是从左到右计算的。在您的语句中,'pointer' 和 'pointer->next' 是您对照 'NULL' 检查的值。
但是,请注意从“指针”访问“next”要求指针本身不为空。尝试从空值访问属性会导致未定义的行为,这就是您程序中发生的情况
因此,在条件语句中,'pointer' 必须在 'pointer->next' 之前。并且,由于使用了“&&”运算符,如果首先对“指针”进行空检查,则条件会立即退出。
,&& 运算符的好处是,只要条件给出第一个 false 值,就不会进一步检查条件。
#include <iostream>
#include <stdlib.h>
using namespace std;
int main() {
struct ll{
int value;
struct ll* next;
};
struct ll* pointer;
while(pointer != NULL && pointer->next != NULL){
cout<< "pointer value:" << pointer <<endl;
}
return 0;
}
注意:在上面的程序中,我没有给指针变量分配空间。
while(pointer!=NULL && pointer->next!=NULL)
由于第一个条件返回 false,因此不检查条件的进一步部分。
#include <iostream>
#include <stdlib.h>
using namespace std;
int main() {
struct ll{
int value;
struct ll* next;
};
struct ll* pointer;
while(pointer->next != NULL && pointer != NULL){
cout<< pointer->next << endl;
}
return 0;
}
注意:在上面的程序中,我没有给指针变量分配空间。
while(pointer->next != NULL && 指针 != NULL)
这里的第一个条件是无效的比较。所以程序转储到这里主要是导致分段错误。