真か偽か、正常か異常か
プログラム言語でのデータ型のひとつとして、論理値型(boolean)というものがあります。
多くのプログラム言語では、論理値型というデータ型以外でも、例えば整数型なら0ならば偽(FALSE)0以外なら真(TRUE)、文字型なら空白" "または"0"ならば偽(FALSE)空白以外は真(TRUE)といったように、論理値としても扱えるようになっています。
また、サブルーチンや関数は返り値(リターンコード)を返すことができます。プログラミング言語や開発環境、あるいは開発プロジェクトにおいては、サブルーチンが正常に終了した場合の返り値は整数型の0とし、異常終了の場合には0以外を返り値とするのが、昔からの一種のお作法のようになっていることがよくあります。
ところが、この返り値のお作法では、返り値を論理値として扱うと、正常終了の場合が偽(FALSE)となり、異常終了の場合が真(TRUE)となり、どうも感覚的に具合がよくありません。こういう場合はえてしてパグを作り込み易いのです。
こういうのも、「歴史的な不整合」のひとつなんでしょうね。
逆に、ファイルオープン命令(関数)の返り値が、ファイル識別子へのポインタになっていて、正常にファイルオープンできたら返り値は0以外、ファイルオープンできなかったら返り値は0という場合もよくあります。
これだと、返り値を論理型と見なして評価すると、正常なら真(TRUE)、異常なら偽(FALSE)となり、感覚的によくあいますね。
こういうのを利用して、例えば以下のようなプログラムが書かれることがあります。(架空のプログラム言語です)
if open(FILE) == true
then do { 正常処理 }
else do { 異常処理 ; abort }
endif;
上記の記述だと分かりやすいのですが、ちょっと凝ったプログラムコードだと以下のように書いてあることがあります。
open(FILE) or { 異常処理 ; abort };
{ 正常処理 };
これは、open命令が正常に終了したら、open命令の返り値は0以外すなわち真(TRUE)なので、論理和(or)の右辺を評価するまでもないのでスキップし、正常処理のルーチンを実行する。
open命令が正常に終了しなかったら、返り値は0すなわち偽(FALSE)なので、論理和の右辺を評価しないといけなくなり、結果的に異常処理のルーチンが実行される、ということになります。
よくできてるなぁ、と思いますか?
私は、こういうプログラミングはバグを作り込みやすく発見しにくいのでよくないプログラミングだと思いますが、みなさんはいかがでしょうか。
| 固定リンク
この記事へのコメントは終了しました。


コメント