这是什么意思“!somePointer”?

时间:2013-10-15 20:51:15

标签: c++ pointers

所以阅读一些代码,并且有一种我不理解的语法。

代码就像这样

int * aPtr = new int();
if(!aPtr)               // this part I don't understand
{
 //some code here
}

我猜测语法是询问指针是否指向null,但是 在我读过的大多数书中,通常都是这样说的

if(aPtr == NULL)
{

}

4 个答案:

答案 0 :(得分:6)

您的问题中有三个要点

1。它是空的吗?

空指针的计算结果为零:

  

空指针常量是一个整数常量表达式(5.19)   整数类型的prvalue,其值为 ...(§4.10/ 1)

因此,要检查指针是否为空,您可以针对进行检查。 传统方式(来自C的遗留)来检查变量是否为

if (!var)  // if (var == 0)

2。什么是宏NULL

它是一个积分常量表达式,其计算结果为零,但是......忘记使用NULL,而是使用0nullptr。有关详细信息,请参阅"Should I use NULL or 0?"


3。如何检查new是否失败?

  

...它由展示位置调用   当C ++程序更喜欢空指针时,new-expression的版本   结果作为错误指示,而不是bad_alloc异常。   (18.6.1.1 / 5)

int *aPtr = new int();
if(!aPtr)

您似乎想要检查new是成功还是失败。这是错误的,因为如果失败则抛出异常,程序将无法到达if (!aPtr)。因此,您应该try/catch处理它。

此外,您可以强制编译器停止抛出异常并返回null。为此,您应该尝试:

int* aPtr = new(std::nothrow) int();

答案 1 :(得分:2)

如果aptr不是nullptr,则

if (aptr == nullptr) 将为非零。这基本上是一种较短的说法:

{{1}}

答案 2 :(得分:1)

!用于逻辑NOT运算符。当附加到指针时,如果指针为空,则返回true。

答案 3 :(得分:1)

运算符!否定其参数

大多数c ++编译器/库中的NULL值被定义为整数零(0),这不是很正确,但无论如何

所以运营商!否定整数值,如果此值为0(即指针为NULL) - 那么我们有true

但一般情况下 - 依赖于此是不好的做法,你应该与nullptr进行比较

更新:根据评论和标准 - 您可以预期NULL被评估为0,因此您可以安全地使用if (pointer)if (!pointer),但我个人更愿意将其与适当的consts进行比较,如然后它清楚地看到它是指针而不仅仅是整数值