测试指针为NULL并比较解除引用的值

时间:2014-01-30 15:03:55

标签: c++ pointers null comparison dereference

我想知道是否有C ++函数,或者至少是这样做的约定:

int a = 5, b = 5, *pa = &a, *pb = &b; //These are example values if the if statement were true

if( ( pa == NULL && pb == NULL ) || ( pa != NULL && pb != NULL && *pa == *pb ) ) //Do stuff

我可以通过以下方式改进:!( ( pa == NULL ) ^ ( pb == NULL ) ) && ( !pa || *pa == *pb ) 但似乎应该有一种更清洁的方式来做到这一点。

4 个答案:

答案 0 :(得分:3)

一种可能的简化是:

if ( ( pa == pb ) || ( pa != NULL && pb != NULL && *pa == *pb ) ) //Do stuff

这是有效的,因为第一个子句处理两种情况:(i)papb都是NULL或(ii)papb是不是NULL,但它们是相等的,因此指向相同的值,在这种情况下*pa == *pb

答案 1 :(得分:3)

我可能会写:

if (pa == pb || (pa && pb && *pa == *pb))

您可以使用由实现比较的帮助程序类支持的函数模板来获得Perl语法的好处:

template <typename T>
struct Maybe {
    T *ptr
    explicit Maybe(T *ptr) : ptr(ptr) {}
    bool operator==(const Maybe &other) const {
        return (ptr == other.ptr) || (ptr && other.ptr && *ptr == *other.ptr);
        // or whatever other answer to this question you like
    }
    bool operator!=(const Maybe &other) const {
        return !(*this == other);
    }
};

// could make it work for smart pointer types too,
// but this is simple
template <typename T>
Maybe<T> maybe(T *ptr) { return Maybe<T>(ptr); }

if (maybe(pa) == maybe(pb)) ...

显然,如果你在很多不同的地方做到这一点,那是唯一值得的。要替换Perl语法的这一用法,您也可以使用一个带有两个指针并返回结果的函数模板...

答案 2 :(得分:1)

谓词“要么两个指针都为空,要么两个指针都是非空的,而且指针是相等的”,可以这样写:

return pa == NULL ? pb == NULL : (pb != NULL && *pa == *pb);

答案 3 :(得分:0)

  

if(pa == pb || pa&amp;&amp; pb&amp;&amp; * pa == * pb)//做东西