12

zlib 1.2.7 のファイル inffast.c の 320 行目に、私が理解できないステートメントがあります。

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

変数endoutは、出力バッファーへの 2 つのポインターです。このステートメントはend - outwhenend > outout - endwhenを計算しようとout >= endしますが、なぜそれが必要なのかわかりません。最終結果は同じように思えます。

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

2 つのポインターの違いには、符号付き整数型ptrdiff_t(C99 6.5.6:9) があり、257型はintです。加算は、これら 2 つの間の上位の型で行われ、三項演算子が何を防いでいる可能性があるのか​​ わかりません。

4

1 に答える 1

17

あなたの観察は、C99 と C89/C90 について正しいです。

そのコード行は 10 年前に書かれました。この時点で、私の記憶では、パラノイアを言い訳にすることしかできません。どうやら私は、一部のコンパイラで 2 つのポインタを減算した結果が符号なしになる可能性があることを懸念していました。その懸念の起源を思い出せませんし、それが何らかの根拠を持っていたとしても、まったく覚えていません。

変更履歴に関しては、そのコード行は、今日見られるようにゼウスの額から生まれました。書かれてから変更されていません。

于 2013-01-17T08:40:03.933 に答える