0 は false ?

プログラミング

某投稿サイトで

「0 が false であるのが分かりにくいと言われているようですが、他の言語でも false を意味することが多いです。 ちなみに、 1 が trueではなく、0以外がtrue という取り扱いです。 覚え方としては ゼニ (ゼロは偽:にせ)として覚えれば間違いありません。

コメントしたら
「結果が0でないとfalse(仮)として扱って処理が止まるものもあるのでその覚え方はやめましょう。」他の回答者に思い切り否定されました。

そこで、以下のコメントを追記しました。

少し大雑把に書きすぎましたね。
何事にも例外はあります。 しかし、例外は基本があっての例外ですから、基本を間違いなく覚えることが必要です。
0 を false とする言語は、多いです。
C, C++, JS, PHP, Perl はそうです。 Javaは文法違反。 Ruby と シェルでは trueと扱われます。
また、文字列が等しい場合、strcmp() の 0 を返しますがこれは文字列間のノルムを計算しているからです。
シェルでは成功した場合0を返すのがエラーがないことを他の数値はエラーコードを示すようになっているのが理にかなっているからです。
false を 0, true を !0 というのは、コンピュータ以前のBool代数の生みの親、ジョージ・ブールの時代から扱われていたようです。


— ここからさらに追加
コンピューター言語学的には0,1とbooleanとは別物だったと言う考えには賛成いたします。 コード可読性点から言っても、false, trueを使うべきです。

以下は、質問の内容から逸れてしまい雑談レベルとして考えてください。
私の経験から言いますと、実装環境において、0をfalseと同様に取り扱われている事が多いという考え方を覚えているのは有用だと思います。 使うべきではありませんが、特に他人の実装を読み解くときにです。 今は使用すると良くないから過去の歴史は忘れましょうでは進歩がありません。
コンパイラーやインタプリタよってバイナリに変換された場合、最終的にすべてのコードは、0,1に変換されます。 この時、0をfalseにしたほうが都合が良いことが多いのです。
たとえば、単純なループを作成するとき、レジスタをカウントダウンしてJNZ命令でループの先頭に戻ると言う処理です。 0(false)の時ジャンプせずループを抜けるわけです。
これまで多くの言語設計者は、こう言った事情があって、0 を falseと同様に扱えるようにしてきたのでしょう。 ただし、厳密な論理性を重視した比較的新しい言語においては、CPU アーキテクチャが充実してきた現在、必ずしもそうでは無いです。
これまで静的型付けを回避してきたRubyで、反対に 0 が true として取り扱われているのは興味深いところです。

つまり、過去の歴史(失敗も含めて)を忘れましょうでは、進歩がないような気がします。
好ましくないけど、0をfalseと同等に扱っている既存の実装が存在している今、それを覚えていることは重要だと思います。

元質問はここにあります。
https://teratail.com/questions/307035#reply-431099

コメント

タイトルとURLをコピーしました