C++ C+中的指针求反+;(!ptr==NULL)
我遇到了指针C++ C+中的指针求反+;(!ptr==NULL),c++,pointers,operators,C++,Pointers,Operators,我遇到了指针ptr if(!ptr == NULL){ delete ptr; ptr = NULL; } 现在,除了使用 null 而不是使用了“代码> > NulLPTR < /代码>,我想知道这个代码是否有意义,并且保证通过C++标准的含义来工作。 通过msvc调试器检查,它会执行它应该执行的操作,即仅当ptr与NULL不同时才执行删除。但我似乎看不出为什么这能在 if(ptr){...} 也可以。这是一段写得很糟糕的代码。GCC和clang都发出了警告。不幸的是,MSVC没有 在表达
ptr
if(!ptr == NULL){
delete ptr;
ptr = NULL;
}
现在,除了使用<代码> null <代码>而不是使用了“代码> > NulLPTR < /代码>,我想知道这个代码是否有意义,并且保证通过C++标准的含义来工作。
通过msvc调试器检查,它会执行它应该执行的操作,即仅当ptr与NULL
不同时才执行删除。但我似乎看不出为什么这能在
if(ptr){...}
也可以。这是一段写得很糟糕的代码。GCC和clang都发出了警告。不幸的是,MSVC没有 在表达式中,
!ptr==NULL
,!ptr
将根据ptr
是否为nullptr
来评估true
或false
(abool
值!)
然后将此bool
值与NULL
进行比较,后者是一个实现定义的NULL指针常量(不鼓励使用它,因为我们现在有nullptr
)。NULL
将转换为bool
(变为false
)。此false
值与来自的bool
进行比较!ptr
。这种比较恰好符合预期
但据推测,这种比较并非有意如此
如果(!(ptr==NULL)),则正确的版本可能是。或如果(ptr!=NULL)
。或者您的简单版本,if(ptr)
请注意,比较是不必要的(因为delete
处理nullptr
指针),因此代码可以简单地:
delete ptr;
ptr = nullptr;
这是一段写得很糟糕的代码。GCC和clang都发出了警告。不幸的是,MSVC没有
在表达式中,!ptr==NULL
,!ptr
将根据ptr
是否为nullptr
来评估true
或false
(abool
值!)
然后将此bool
值与NULL
进行比较,后者是一个实现定义的NULL指针常量(不鼓励使用它,因为我们现在有nullptr
)。NULL
将转换为bool
(变为false
)。此false
值与来自的bool
进行比较!ptr
。这种比较恰好符合预期
但据推测,这种比较并非有意如此
如果(!(ptr==NULL))
,则正确的版本可能是。或如果(ptr!=NULL)
。或者您的简单版本,if(ptr)
请注意,比较是不必要的(因为delete
处理nullptr
指针),因此代码可以简单地:
delete ptr;
ptr = nullptr;
这是一个运算符优先级问题
,因此您的条件将被解析为(!ptr)==NULL,而不是!(ptr==NULL)
这大致会导致(ptr!=NULL)==NULL
,或!(ptr)
,这与您想要的正好相反。这是一个运算符优先级问题
,因此您的条件将被解析为(!ptr)==NULL,而不是!(ptr==NULL)
这大致会导致(ptr!=NULL)==NULL
,或!(ptr)
,这与您想要的正好相反。请注意,您可以传递一个空指针到delete
,然后它将什么也不做。fwiw,这两个检查都不需要,您可以直接使用delete ptr;ptr=NULL代码>delete
可以处理nullptr
为什么它是!ptr==NULL
而不是!(ptr==NULL)
?真正的问题至于风格,你必须问作者,我们无法真正回答或帮助你。这可能是一个程序员的错误,只是碰巧做了与预期结果相同的事情。它之所以有效,是因为NULL
定义为0。请注意,您可以将NULL指针传递给delete
,然后它将什么也不做。fwiw,这两个检查都不需要,您可以直接使用delete ptr;ptr=NULL代码>delete
可以处理nullptr
为什么它是!ptr==NULL
而不是!(ptr==NULL)
?真正的问题至于风格,你必须问作者,我们无法真正回答或帮助你。这可能是一个程序员的错误,只是碰巧做了与预期结果相同的事情。它之所以有效,是因为NULL
被定义为0。