この質問は馬鹿げているように聞こえるかもしれませんが、ほとんどのプログラミング言語が0
評価されfalse
、他の[整数]値が評価されるのはなぜtrue
ですか?
文字列比較
質問は少し単純すぎるように思えるので、もう少し説明します。まず、プログラマーにとっては明白に思えるかもしれませんが、なぜプログラミング言語がないのか-実際にはあるかもしれませんが、私は使用しました-どこに0
評価しtrue
、他のすべての[整数]値を評価しfalse
ますか?その発言はランダムに見えるかもしれませんが、私はそれが良いアイデアだったかもしれないいくつかの例を持っています。まず、文字列の3者間比較の例を取り上げましょstrcmp
う。Cを例に取ります。C 言語を最初の言語として試すプログラマーは、次のコードを書きたくなるかもしれません。
if (strcmp(str1, str2)) { // Do something... }
文字列が等しいときに評価されるstrcmp
戻り値なので、最初のプログラマーがやろうとしたことは惨めに失敗し、一般的に最初はなぜか理解できません。していたために評価上記1 - -代わりに、この関数はその最も単純な式で使用されている可能性が平等を比較するとき、およびのための適切なチェックとは、必要なときにのみ行われていたであろう。ほとんどの場合、戻り値の型を(私たちの考えでは)考えていたでしょう。0
false
0
true
-1
1
bool
さらに、sign
値-1
、0
およびのみを受け取る新しいタイプを導入しましょう1
。それはかなり便利です。C ++に宇宙船オペレーターがあり、それを望んでいると想像してくださいstd::string
(まあ、既にcompare
関数はありますが、宇宙船オペレーターはもっと楽しいです)。現在、宣言は次のようになります。
sign operator<=>(const std::string& lhs, const std::string& rhs);
していた0
ために評価されtrue
、宇宙船演算子は存在さえしないだろう、と私たちは宣言している可能性がoperator==
そのように:
sign operator==(const std::string& lhs, const std::string& rhs);
これoperator==
は3者間比較を一度に処理し、必要に応じてどの文字列が辞書的に優れているかを確認しながら、次のチェックを実行するために使用できます。
if (str1 == str2) { // Do something... }
古いエラー処理
現在、例外があるため、この部分は、そのようなものが存在しない古い言語(Cなど)にのみ適用されます。Cの標準ライブラリ(およびPOSIXのライブラリ)を見ると、maaaaany関数0
が成功すると必ず戻り、それ以外の整数は必ず戻ります。悲しいことに、このようなことをする人を見たことがあります。
#define TRUE 0
// ...
if (some_function() == TRUE)
{
// Here, TRUE would mean success...
// Do something
}
プログラミングの考え方を考えると、次のような推論パターンがよくあります。
Do something
Did it work?
Yes ->
That's ok, one case to handle
No ->
Why? Many cases to handle
私たちはもう一度考えてみれば、それは、唯一の中立値を入れることに意味をなされているだろう0
、とyes
(それはCの関数がどのように動作するかだ)他のすべての値は、多くの例を解決するために存在することができますが、no
。ただし、私が知っているすべてのプログラミング言語(いくつかの実験的なエサトリック言語を除く)では、条件でyes
評価さfalse
れ、if
すべてのno
ケースで評価されtrue
ます。「機能する」が1つのケースを表し、「機能しない」が多くの考えられる原因を表す場合が多くあります。そのように考えれば、0
評価しtrue
て残りを評価した方false
がずっと理にかなっているでしょう。
結論
どこなぜ我々は、言語を設計しました:私の結論は、基本的に私の元の質問で0
ありfalse
、その他の値はtrue
私のいくつかの例を超えると、多分私はいくつかのより多くの考えていなかったアカウントに取って、?
フォローアップ:多くのアイデアと多くの考えられる理由があり、それがそのようになる理由はたくさんあります。あなたがそのことに情熱を傾けているように見えるのが大好きです。私はもともと退屈からこの質問をしましたが、あなたはとても情熱的に思えるので、少し進んで、Math.SEの0と1のブール選択の背後にある理論的根拠について尋ねることにしました:)
if true ; then ... ; fi
ここtrue
で、はゼロを返すコマンドで、これはif
runを指示します...
。
bool
などの条件は任意の戻り値を持つことができるかどうかのタイプが、比較を/。
strcmp()
3つの異なる値を返すため、trueまたはfalseの良い例ではありません。そして、シェルの使用を開始すると驚かれます。0はtrueを意味し、それ以外はfalseを意味します。