我一直想知道:根据定义,不ptrdiff_t
应该能够保持任何两个指针的差异吗?当两个指针太远时怎么会失败呢?(我没有指出任何特定语言......我指的是所有具有此类型的语言.)
(例如1
,0xFFFFFFFF
当你有32位指针时,从带有地址的字节指针中减去带有地址的指针,它会溢出符号位...)
Mat*_* M. 28
不它不是.
$ 5.7 [expr.add](来自n3225 - C++ 0x FCD)
当减去指向同一数组对象的元素的两个指针时,结果是两个数组元素的下标的差异.结果的类型是实现定义的有符号整数类型; 此类型应std::ptrdiff_t
与<cstddef>
标题(18.2)中定义的类型相同.与任何其他算术溢出一样,如果结果不适合所提供的空间,则行为未定义.换句话说,如果表达式P
和Q
指向,分别为i
和第j
一个数组对象的个元素,表达式(P)-(Q)
的值为i ? j
提供的值在适合类型的对象std::ptrdiff_t
.此外,如果表达式P
指向要么一个数组对象或一个过去的阵列对象的最后元件,并且表达的元件Q
指向相同的数组对象的最后一个元素时,表达((Q)+1)-(P)
具有相同的值((Q)-(P))+1
和作为-((P)-((Q)+1))
,和如果表达式P
指向一个超过数组对象的最后一个元素的值,则值为零,即使该表达式(Q)+1
未指向数组对象的元素.除非两个指针指向同一个数组对象的元素,或者指向数组对象的最后一个元素,否则行为是未定义的.
请注意undefined
段落中出现的次数.另请注意,如果指针指向同一对象,则只能减去指针.
不,因为没有"任何两个指针"之间的区别.您只能减去指向同一数组元素的指针(或指向刚好超过数组末尾的位置的指针).
归档时间: |
|
查看次数: |
1761 次 |
最近记录: |