您的位置:首页 > 编程语言 > C语言/C++

读C++标准系列 - 5.6~5.15 双目运算符(指针运算)

2007-12-18 15:11 260 查看
返回目录

5.7 + -
对于涉及指针的算术运算,标准中有比较严格的限制条件:
参与运算的指针必须指向数组对象中的元素,或者指向数组对象最后一个元素的下一个元素(这是STL中能够使用distance(v.begin(),v.end())计算元素个数的前提条件)。
(注:对于指向普通对象的指针,可以将该对象当成长度为1的数组中的元素)(5.7-4)
否则,会导致未定义的行为。

指针加减一个整型类型,相当于对指针对应的数组元素的下标进行加减操作。
如果数组有N个元素,只要计算得到的下标在[0,N]之间,结果都是有效的,而且保证不会溢出,否则结果是未定义的。(5.7-5)

两个指针相减,相当于对两个指针对应的数组元素的下标相减(5.7-6)
结果的类型是std::ptrdiff_t(在<cstddef>头文件中)。ptrdiff_t具体是什么类型是实现相关的,不过必然是有符号整型。
如果相减的结果溢出,那么会导致未定义的行为。

对指针进行+0或者-0的操作不会对指针的值产生影响。(5.7-7)
如果两个指针指向数组对象中的同一个元素,或者都是NULL,那么两者相减将得到0

5.9~5.10 < > == !=
因为只有指向相同类型的指针才能够进行比较,所以当指针参与比较运算的时候,会进行默认的指针类型转换(0->(T *)0,T *->void *,Derived *->Base *,T *->T const *等等)(4.10&4.4),以使两者的类型一致。

void *p;
const int *q;
int **pi;
const int *const *pci;
p <= q; // both converted to const void * before comparison
pi <= pci; // both converted to const int * const * before comparison

指针比较遵循以下的原则:

1、如果两者都是NULL,则相等
2、如果仅其中之一是NULL,则不相等
3、如果两个指针满足前面指针的算术运算的要求,那么比较的结果取决于它们指向元素的下标
4、如果两个成员函数指针对应同一个对象的同一个函数(不能是虚函数),那么两者相等
(在下面的例子中,pdl指向的对象是L的基类B,pdr指向的对象是R的基类B,两个对象并不不同,所以返回false:
struct B {
int f();
};
struct L : B { };
struct R : B { };
struct D : L, R { };

void Test()
{
int (B::*pb)() = &B::f;
int (L::*pl)() = pb;
int (R::*pr)() = pb;
int (D::*pdl)() = pl;
int (D::*pdr)() = pr;
bool x = (pdl == pdr); // false
})
5、如果两个指针指向同一个对象(非union)的非静态成员变量,那么它们的大小关系取决于它们声明的顺序
(注:必须是在同一个访问权限标识符下,否则标准没有规定返回值
(换句话说,对于在不同访问权限标识符中定义的变量,具体的实现有权自由安排它们的顺序。这点需要额外小心,特别是在构造函数的初始化列表中使用这些成员时)
在下例中,a必然在b的前面,而c和a、b的位置关系则取决于具体的实现:
public A
{
int a;
int b;
private:
int c;
};

6、如果两个指针指向同一个union中的成员变量,那么两者是相等的
7、对于其它情况,标准没有规定比较的结果
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: