Part 7.変数の定義域(7)


一般的に前判定で書くのが辛いということがわかれば、変数の定義域をわざとある程度余裕を持たせておく、というのは現実的なプログラミングだと言える。


たとえば、通常、byteの範囲しか取らないとしても、これをintで計算する価値は十分にある。たとえば、オーバーフローの判定がそうだ。次の飽和加算を考えてみよう。


if ( R + Rc > 255) R=255;
if ( G + Gc > 255) G=255;
if ( B + Bc > 255) B=255;

R,G,Bは通常、byteの範囲しか取らないとしても、(一時的にcastするなり何なりで)intの範囲で計算できないとすればオーバーフローの判定を行なうのは苦しい。仮に、Rc = Gc = Bc = 20のような定数だとすれば、上記のif文は以下のように書き換えられる。


if ( R > 255-20) R=255;
if ( G > 255-20) G=255;
if ( B > 255-20) B=255;

これならば、R,G,Bがbyteのレンジしか取れなくても構わない。これは、後判定を前判定に書き換えたときと同じ考えかただ。


結局のところ、後判定を前判定に書き換えられるのは一定の条件を満たしたときだけであり、前判定に書き換えることでここで見てきたようなメリットが得られる。しかし後判定になるほうが一般的なので、そのために、変数は本来ループ内等で取りうる範囲より広い定義域を持つと便利なことがある。そして、delimiterという考えかたは、後判定に絡んだhackだと言える。


ここでは、以上のように結論づけて変数の定義域に対する考察を終わるとしよう。