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
(a
bool
值!)

然后将此
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
(a
bool
值!)

然后将此
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。