【问题标题】:while(pointer!=NULL && pointer->next!=NULL) vs while(pointer->next!=NULL && pointer!=NULL) in C++C++ 中的 while(pointer!=NULL && pointer->next!=NULL) 与 while(pointer->next!=NULL && pointer!=NULL)
【发布时间】:2021-10-01 09:15:29
【问题描述】:

我试图检测链表中的循环。当我设置条件while(pointer!=NULL && pointer->next!=NULL) 时,一切正常,提供了所有理想的输出。但是当我反转条件时,当不存在循环时它停止显示输出。就像当一个循环存在时,它给出真实的输出,但是当它不存在时,它不给出任何输出。所以,我想知道背后的原因是什么。

【问题讨论】:

标签: c++ computer-science


【解决方案1】:

因为条件是从左到右计算的。在您的语句中,'pointer' 和 'pointer->next' 是您对照 'NULL' 检查的值。

但是,请注意,从“指针”访问“下一个”需要指针本身不为空。尝试从空值访问属性会导致未定义的行为,这就是您的程序中发生的情况

因此,'pointer' 必须在条件语句中的 'pointer->next' 之前。而且,由于使用了 '&&' 运算符,如果首先对 'pointer' 进行空检查,则条件会立即退出。

【讨论】:

    【解决方案2】:

    && 运算符的好处是,只要条件给出第一个 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)

    这里的第一个条件是无效的比较。所以程序在这里转储主要是分段错误。

    【讨论】:

    • pointer != NULL 不一定是假的。由于pointer未初始化,读取为UB。
    • 在声明指针后打印指针的值时,它显示值:0。 NULL 的值是实现定义的,但通常定义为整数常量 0。所以我认为它的 false as 0 != 0 是 false。谢谢指出。
    • 一些编译器will warn you about it being uninitialized“感谢您指出。”考虑编辑您的答案以修复它。
    猜你喜欢
    • 1970-01-01
    • 2013-09-27
    • 1970-01-01
    • 1970-01-01
    • 2016-12-05
    • 2011-10-05
    • 2022-12-27
    • 2013-07-20
    相关资源
    最近更新 更多