在zlib 1.2.7,文件inffast.c,第320行,有一个我不明白的声明:
strm->avail_out = (unsigned)(out < end ?
257 + (end - out) : 257 - (out - end));
变量end
和out
是输出缓冲区的两个指针。
此声明会在end - out
时计算end > out
,out - end
时计算out >= end
,但我不明白为什么要这样做。在我看来,最终的结果是相同的,也就是说,这条线也可以写成:
strm->avail_out = 257 + (end - out);
两个指针的差异有一个有符号整数类型ptrdiff_t
(C99 6.5.6:9),而257
有int
类型。增加发生在这两者之间的更高等级的类型,我不明白三元运营商可能会防范什么。
答案 0 :(得分:17)
您对C99以及C89 / C90的观察是正确的。
这行代码是十年前写的。在这一点上,我的记忆只允许我以偏执狂为借口。显然我担心在某些编译器中,减去两个指针的结果可能是无符号的。我不记得那个问题的根源,或者它是否有任何基础。
对于change history,这行代码是从你今天看到的Zeus的眉毛中诞生的。自写完以来它没有改变。