我想知道是否有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 )
但是似乎应该有一种更干净的方法。
我可能会写:
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语法的使用,您也可以拥有一个功能模板,该模板需要两个指针并返回结果...
一种可能的简化是:
if ( ( pa == pb ) || ( pa != NULL && pb != NULL && *pa == *pb ) ) //Do stuff
这起作用是因为第一个子句处理了两种情况:(i)pa
和pb
都是NULL
或(II)pa
和pb
并非零,但它们是相等的,因此指向相同的值,在这种情况下为*pa == *pb
。
谓词"两个指针均为null,或者两个指针都是非零的,并且尖端是相等的",可以像这样写:
return pa == NULL ? pb == NULL : (pb != NULL && *pa == *pb);
if(pa == pb || pa&amp;&amp; pb&amp;&amp;&amp; *pa == *pb)//做东西