3

所以阅读一些代码,并且有一个我不明白的语法。

代码是这样的

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

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

if(aPtr == NULL)
{

}
4

4 回答 4

6

你的问题有三个重点

 

1.它是空的吗?

空指针的计算结果为零:

空指针常量是整数类型的整数常量表达式 (5.19) prvalue,其计算结果为零...(§ 4.10 /1)

所以要检查一个指针是否为空,你可以检查它是否为零。检查变量是否为零的传统方式(来自 C 的传统方式)是

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

 

2.什么是宏NULL

它是一个积分常数表达式,其计算结果为零,但是.. 忘记使用NULL,使用0ornullptr代替。有关更多信息,请阅读“我应该使用 NULL 还是 0?”


 

3. 如何检查new失败与否?

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

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

看来您想检查是new成功还是失败。这是错误的,因为如果失败,它会抛出异常,并且程序将无法访问if (!aPtr). 因此,您应该按try/catch.

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

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

 

于 2013-10-15T20:51:56.000 回答
2

aptr如果它不是nullptr. 这基本上是一种较短的说法:

if (aptr == nullptr)
于 2013-10-15T20:52:12.243 回答
1

运算符!否定它的论点

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

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

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

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

于 2013-10-15T21:01:19.437 回答
1

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

于 2013-10-15T20:53:10.520 回答