所以阅读一些代码,并且有一种我不理解的语法。
代码就像这样
int * aPtr = new int();
if(!aPtr) // this part I don't understand
{
//some code here
}
我猜测语法是询问指针是否指向null,但是 在我读过的大多数书中,通常都是这样说的
if(aPtr == NULL)
{
}
答案 0 :(得分:6)
您的问题中有三个要点
空指针的计算结果为零:
空指针常量是一个整数常量表达式(5.19) 整数类型的prvalue,其值为零 ...(§4.10/ 1)
因此,要检查指针是否为空,您可以针对零进行检查。 传统方式(来自C的遗留)来检查变量是否为
if (!var) // if (var == 0)
NULL
?它是一个积分常量表达式,其计算结果为零,但是......忘记使用NULL
,而是使用0
或nullptr
。有关详细信息,请参阅"Should I use NULL or 0?"
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进行比较,如然后它清楚地看到它是指针而不仅仅是整数值