12

在 zlib 1.2.7,文件 inffast.c,第 320 行,有一句我不明白的语句:

strm->avail_out = (unsigned)(out < end ?
                             257 + (end - out) : 257 - (out - end));

变量endout是指向输出缓冲区的两个指针。该语句努力计算end - outwhenend > outout - endwhen out >= end,但我不明白它为什么要这样做。在我看来,最终结果是一样的,也就是说,这行还不如写成:

strm->avail_out = 257 + (end - out);

两个指针的差值具有带符号整数类型ptrdiff_t(C99 6.5.6:9),并且257具有int. 添加发生在这两者之间的更高级别的类型中,我看不出三元运算符可能会防范什么。

4

1 回答 1

17

您的观察对于 C99 和 C89/C90 都是正确的。

那行代码是十年前写的。在这一点上,我的记忆只允许我以偏执狂为借口。显然我担心在某些编译器中减去两个指针的结果可能是无符号的。我不记得这种担忧的起源,或者它是否有任何根据。

至于变更历史,正如你今天看到的那样,那行代码是从宙斯的眉毛中诞生的。自从写出来之后就没有变过。

于 2013-01-17T08:40:03.933 回答