TRUE は 0 として定義されていて、他のすべての値は FALSE であると主張する同僚がいます。私が扱ってきたすべての言語で、ブール値を取得できれば、FALSE の値は 0 であると断言できます。TRUE は以前は 0 でしたか? もしそうなら、いつ切り替えましたか?
22 に答える
あなたの同僚が混乱している 0 / 非 0 のことは、人々が成功を示す戻り値として、真実ではなく数値を使用する場合 (つまり、bash スクリプトや C/C++ の一部のスタイル) に言及している可能性があります。
0 = 成功を使用すると、失敗の原因をより正確に特定できます (たとえば、1 = ファイルが見つからない、2 = 四肢が見つからない、など)。
ちなみに、Ruby では、false 値は nil と false だけです。0 は真ですが、他の数値とは異なります。オブジェクト 0 のインスタンスであるため、0 は true です。
ほとんどの場合、プロセスが実行された後、結果コード 0 は「すべて正常に機能しました。問題はありません」という意味でした。
私は大量の古い C コードを扱う会社で働いていました。共有ヘッダーの中には、TRUE と FALSE に独自の値を定義しているものもあれば、TRUE を 0 に、FALSE を 1 にしているものもありました。これが「真実の戦い」につながりました。
/* like my constants better */
#undef TRUE
#define TRUE 1
#undef FALSE
#define FALSE 0
他に何もない場合でも、bash シェルは true に 0 を使用し、false に 1 を使用します。
C 標準ライブラリのいくつかの関数は、結果として「エラー コード」整数を返します。noErr は 0 と定義されているため、「0 なら OK」という簡単なチェックが可能です。同じ規則が Unix プロセスの「結果コード」にも適用されます。つまり、特定のプロセスがどのように終了したかを示す整数です。
Unix シェル スクリプトでは、実行されたばかりのコマンドの結果コードが利用可能であり、通常、コマンドが「成功」したかどうかを示すために使用されます。0 は成功を意味し、それ以外は特定の不成功状態を意味します。
そのため、シェル スクリプト内のすべてのテストに似た構造は、「成功」(つまり、結果コード 0) を使用して TRUE を意味し、それ以外は FALSE を意味します。
まったく別の面では、デジタル回路は「負論理」を頻繁に使用します。つまり、0 ボルトが「バイナリ 0」と呼ばれ、正の値 (通常は +5v または +3.3v ですが、最近では +1.8v を使用することも珍しくありません) が「バイナリ 1」と呼ばれていても、一部のイベントは「アサート」されます。特定のピンが0になることによって。ノイズに強いという利点があると思いますが、理由はわかりません。
ただし、これには「古代」や「切り替え時間」は何もないことに注意してください。これについて私が知っていることはすべて古い慣習に基づいていますが、今日では完全に最新であり、関連性があります。
確かではありませんが、これは言えます: TRUE と FALSE の基本的な性質に依存するトリックは、これらの値の定義が言語の実装者に任されているため (または、少なくとも、指定子)。
原則:
シェル(DOSを含む)は「エラーなし」として「0」を使用します...必ずしも正しいとは限りません。
プログラミング言語は、ゼロ以外を使用して真を示します。
とは言うものの、あなたがFALSEのTRUEを定義できる言語を使用している場合は、それを定義し、常に定数を使用してください。
C 標準ライブラリのシステム コールは通常、エラーの場合は -1 を返し、成功の場合は 0 を返します。また、Fotran の計算された if ステートメントは、0 より小さい、0 に等しい、または 0 より大きいと評価される条件に応じて、3 つの行番号のいずれかにジャンプします (おそらく今でもそうです)。
例: IF (I-15) 10,20,10
I == 15 の条件をテストして、true (ゼロに評価される) の場合は 20 行目にジャンプし、そうでない場合は 10 行目にジャンプします。
サムは、実装の詳細に関する特定の知識に頼ることの問題については正しいです。
C言語では、C ++以前は、ブール値のようなものはありませんでした。条件は、intをテストすることによって行われました。ゼロは偽を意味し、ゼロ以外は真を意味します。だからあなたは書くことができます
if (2) {
alwaysDoThis();
} else {
neverDothis();
}
幸い、C++では専用のブール型が許可されていました。
True が -1 の Access フォームで VB プログラミングを行ったことを思い出します。
bash の true/false return ステートメントが逆の場合、混乱するのは簡単です。
$ false; echo $?
1
$ true; echo $?
0
面白いことに、使用している言語によって異なります。In Lua is true == zero internal for performance.. C の多くの syscall で同じです。
ほとんどの場合、false は 0 として定義され、true は非ゼロとして定義されます。1 を使用するプログラミング言語もあれば、-1 を使用するプログラミング言語もあれば、ゼロ以外の値を使用するプログラミング言語もあります。
ただし、Unix シェルの場合は、逆の規則が使用されます。
Unix シェルで実行されるほとんどのコマンドは、実際には小さなプログラムです。コマンドが成功したか (値 0)、何らかの理由で失敗したか (失敗の種類に応じて 1 以上) を判断できるように、終了コードが返されます。
これは、条件をチェックするために if/while/until コマンド内の sh/ksh/bash シェル インタープリターで使用されます。
コマンドの場合 それから # 成功 フィ
コマンドが成功した場合 (つまり、ゼロの終了コードが返された場合)、ステートメント内のコードが実行されます。通常、テスト コマンドのエイリアスである [ コマンドが使用されます。
true > 0、および false <= 0 である古いコンパイラについて聞いたり、使用したりしたことがあります。
これが、ゼロをチェックするために if(pointer) または if(number) を使用したくない理由の 1 つです。予期せず false と評価される可能性があります。
同様に、私は NULL がゼロでないシステムに取り組んできました。
今日でも、一部の言語 (Ruby、Lisp など) では、nil 以外はすべて true であるため、0 が true です。多くの場合、1 が true です。これはよくある落とし穴なので、0 が false であることに依存するのではなく、明示的なテストを行うことをお勧めします。Java では、これを行う必要があります。
これの代わりに
int x;
....
x = 0;
if (x) // might be ambiguous
{
}
Makeは明示的です
if (0 != x)
{
}
PL/1 にはブール値クラスがなかったのを覚えています。ビットを作成して、ブール式の結果を割り当てることができます。次に、それを使用するには、1 が false で 0 が true であることを覚えておく必要がありました。
アプリケーションからのDOSおよび終了コードは、通常、成功を意味するために0を使用し、あるタイプの失敗を意味するためにゼロ以外を使用します。
DOSエラーコードは0〜255であり、「errorlevel」構文を使用してテストした場合、指定された値を超えるか含むものを意味します。したがって、以下は2以上を最初のgotoに、1を2番目に、0(成功)を最後のgotoに一致させます。 !!
IF errorlevel 2 goto CRS
IF errorlevel 1 goto DLR
IF errorlevel 0 goto STR
TRUE
であったことを思い出せません0
。
0
ただし、C プログラマーが成功を示すために返すものです。これは と混同される可能性がありTRUE
ます。
それも常にではありません1
。-1
ゼロ以外の場合もあります。
ブール型が組み込まれていない言語では、TRUE を 1 に、FALSE を 0 に定義するという規則しか見たことがないif
。 .
TRUE と FALSE を再定義しないように具体的に述べたコーディング ガイドライン ドキュメントを見たことがあります。:)
C++ のようにブール値が組み込まれている言語を使用している場合、キーワードtrue
とキーワードfalse
は言語の一部であり、それらが実際にどのように実装されているかに依存するべきではありません。
私がこれまで取り組んできたどの言語でも (70 年代後半に BASIC に戻りました)、false は 0 と見なされ、true は 0 以外でした。
C のような言語では、ブール値がないため、独自に定義する必要がありました。非標準の BOOL オーバーライドに取り組んだ可能性はありますか?
SQL Server データベース エンジンは、ビット列のストレージを最適化します。テーブル内のビット列が 8 つ以下の場合、列は 1 バイトとして格納されます。9 ~ 16 ビットの列がある場合、列は 2 バイトとして格納されます。文字列値 TRUE および FALSE はビット値に変換できます。TRUE は 1 に変換され、FALSE は 0 に変換されます。ビットに変換すると、ゼロ以外の値はすべて 1 に昇格します。
すべての言語は 0 を true または false として持つことができるので、数字の使用をやめて単語を true に使用します Lol または t と f 1 バイト ストレージ