我一直想知道:不是吗ptrdiff_t
应该能够保存任意两个指针的差异根据定义?为什么当两个指针距离太远时会失败? (我不是指任何特定的语言......我指的是具有这种类型的所有语言。)
(例如,用地址减去指针1
从带有地址的字节指针0xFFFFFFFF
当你有 32 位指针时,它会溢出符号位......)
不它不是。
$5.7 [expr.add](来自 n3225 - C++0x FCD)
当两个指向同一数组对象的元素的指针相减时,结果是两个数组元素的下标之差。结果的类型是实现定义的有符号整型;该类型应与定义为相同的类型std::ptrdiff_t
in the <cstddef>
标题(18.2)。与任何其他算术溢出一样,如果结果不适合所提供的空间,则行为未定义。
换句话说,如果表达式P
and Q
分别指向i
-th and j
- 数组对象的第一个元素,表达式(P)-(Q)
有价值i − j
前提是该值适合类型的对象std::ptrdiff_t
。此外,如果表达式P
指向数组对象的一个元素或指向数组对象的最后一个元素,并且表达式Q
指向同一数组对象的最后一个元素,表达式((Q)+1)-(P)
具有相同的值((Q)-(P))+1
and as -((P)-((Q)+1))
,并且如果表达式为零,则值为零P
指向数组对象最后一个元素之后的一个元素,即使表达式(Q)+1
不指向数组对象的元素。除非两个指针都指向同一数组对象的元素,或者指向数组对象的最后一个元素,否则该行为是未定义的。
注意次数undefined
出现在段落中。另请注意,只有当指针指向同一对象时,您才能减去它们。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)