web-dev-qa-db-ja.com

1 = falseおよび0 = true?

私は職場のc APIでis_equals()関数を見つけました。これは、等しくないsqlテーブルに対して1(false)と等しいテーブルに対して0(true)を返しました。私はコードでテストケースを実行した後にのみ実現しました。1つはポジティブな例、もう1つはネガティブで、両方とも最初はほとんど意味がありませんでした。 APIのコードにはバグがありません。出力がドキュメントに正しく記録されているためです。

私の質問-この論理的NOTingが正常な逆さまの世界/パラレルユニバース/コーディング言語はありますか?通常、1は正しくありませんか? APIのコーダーはエラーを起こしていますか?

24
Ben

比較関数は「等しい」で_0_を返すのが一般的であるため、「より小さい」の場合は負の数を返し、「より大きい」の場合は正の数を返すこともできます。 strcmp()memcmp()はこのように機能します。

ただし、ゼロがfalseであり、ゼロ以外がtrueになることは慣用的です。これは、Cフロー制御と論理ブール演算子が機能する方法だからです。そのため、この関数に選択された戻り値は問題ないかもしれませんが、エラーになっているのは関数のnameです(実際には、単にcompare()または同様の名前にすべきです)。

35
caf

この逆さまの世界は、プロセスエラーリターンでよく見られます。シェル変数$?は、シェルから実行する前のプログラムの戻り値を報告するため、プログラムが成功したか失敗したかを簡単に判断できます。

$ false ; echo $?
1
$ true ; echo $?
0

これが選択された理由は、プログラムが成功するケースは1つだけですが、プログラムが失敗する理由は多数あります-さまざまなエラーコードを許可することで、プログラムはを決定できますwhy出力を解析することなく別のプログラムが失敗しました。

具体例はaa-statusAppArmor必須アクセス制御 ツールで提供されるプログラム:

   Upon exiting, aa-status will set its return value to the
   following values:

   0   if apparmor is enabled and policy is loaded.

   1   if apparmor is not enabled/loaded.

   2   if apparmor is enabled but no policy is loaded.

   3   if the apparmor control files aren't available under
       /sys/kernel/security/.

   4   if the user running the script doesn't have enough
       privileges to read the apparmor control files.

(この振る舞いを持つより広く普及したプログラムがあると確信していますが、私はこれをよく知っています:)

14
sarnold

Linux/Unix標準成功時に0を返す に従っているだけだと思います。

really」は「1」が偽で「0」が真であると言いますか?

5
Peter K.

1がtrueで0がfalseである理由はありません。それは物事が常に記されている方法です。したがって、論理的な観点からは、APIの関数自体は「間違った」ものではありません。

とはいえ、通常は使用することはお勧めできませんagainst使用する言語やフレームワークのイディオムは、そうする理由はありません。単なるバグではありません。

5
Brennan Vincent

これは元の著者の間違いかもしれませんが、1が真で0が偽であるという概念は普遍的な概念ではありません。シェルスクリプトでは、成功の場合は0、失敗の場合はその他の数値が返されます。 Rubyなどの他の言語では、nilとfalseのみがfalseと見なされ、他の値はtrueと見なされるため、in Ruby 1と0の両方がtrueと見なされます。

3
Kelend

私が質問に正しく答えているかどうかはわかりませんが、おなじみの例があります:

WindowsのGetLastError()の戻り値の型は、エラーが発生した場合はゼロ以外、そうでない場合はゼロです。通常、呼び出した関数の戻り値は逆です。

2
Mehrdad