ptrdiff_t为什么不长久一样?

Mar*_*eck 3 c

根据当前的C标准,指针之间的差异有类型ptrdiff_t.同时,根据标准,数组的下标可以是任何整数类型,并且当前是最大的有符号整数类型long long.

如果ptrdiff_t不是long long,但更小,那么上述两个陈述将是矛盾的,不是吗?

那么为什么标准会引入类型ptrdiff_t而不只是long long用作指针差异?

mel*_*ene 6

首先,ptrdiff_t是一个有符号的类型(两个指针之间的差异可以是负数),所以排除了unsigned long long.

数组下标可以是任何整数类型,但结果值必须在边界内.例如,在32位平台上,您不能拥有超过40亿个元素的数组,因此ptrdiff_t很可能是32位整数类型.使用long long超过32位的值索引数组只会导致未定义的行为(边界访问权限).

像往常一样,真正的原因是向后兼容性:long long很久以后就添加到语言中ptrdiff_t,并且ptrdiff_t在编译器编写完成后添加.当现有代码依赖于(几十年前的)行为时,为指针算法指定完全不同的规则(例如"减去两个指针必须产生64+位结果")是没有意义的.