2009-08-08 100 views
0

我不确定我对C++的理解是否是错误的。我读过1)所有非零值相当于TRUE,零相当于FALSE; 2)空指针被存储为零。C++零(空)指针应该返回false吗?

然而,这样的代码:

void ViewCell::swapTiles (ViewCell *vc) { 
    ViewTile *tmp = vc->tile(); 
    [stuff ...] 
    if (tmp) addTile(tmp); 
} 

给我提领,从一个空指针段错误,但

if (tmp != 0) addTile(tmp); 

工作正常。任何想法为什么?

+3

只需在旁边注释,空指针不需要在硬件中表示为零,但编译器将这种复杂因素考虑在内。 – 2009-08-08 07:36:11

回答

8

对于指针,p(p != 0)是完全等效的。如果它给你一个段错误,那么要么它不是一个普通的指针,要么是其他地方的问题

+0

是的,我认为你是对的。在修改代码的其他部分之后,我的问题似乎消失了。尽管不太清楚它是如何发生的。 – int3 2009-08-08 07:36:32

+0

编译器代码生成错误?或者segfault真的是其他地方? – pjc50 2009-11-03 13:46:30

1

C++ 0指针不一定被存储为全零位模式,但是令牌0总是被解释为0指针if编译器认为它是一个指针,如果编译器认为它是一个需要进行类型转换的整数,则整数0总是强制为0指针(可能具有不同的位模式)。指向不同事物的指针可以具有不同的sizeof,它也可以是与整数不同的sizeof。但是你可以看到它是如何工作的。通常。明确?

+0

这么多泥水,值得删除。你所说的话可能在技术上是真实的,但是你从原来的问题来解释它很糟糕,它会让新人感到困惑。重新分解或删除。 – 2009-08-08 18:07:51

+1

整数0并不总是强制为空指针。例如,'int n = 0; void * p =(void *)n;'是U.B.,特别是不需要使'p'成为空指针。如上所述,只有一个整型立即数0才能被视为一个空指针。 – 2009-08-09 04:29:33

+0

他指的是,我认为,'指向类的成员'类型,有奇怪的0比较。 – 2013-03-11 06:04:05