161

Cでの定義を見てきました

#define TRUE (1==1)
#define FALSE (!TRUE)

これは必要ですか?TRUE を 1 に、FALSE を 0 に単純に定義する利点は何ですか?

4

8 に答える 8

157

このアプローチは、コンパイラがサポートしている場合、実際のboolean型を使用します (およびに解決されますtrue) 。false(具体的には C++)

__cplusplusただし、C++ が使用されているかどうかを (マクロ経由で) 確認し、実際に and を使用する方がよいでしょtruefalse

0C コンパイラでは、これはおよび と同等1です。
(括弧を削除すると、操作の順序が原因で壊れることに注意してください)

于 2013-06-09T13:24:51.347 に答える
18
#define TRUE (1==1)
#define FALSE (!TRUE)

と同等です

#define TRUE  1
#define FALSE 0

Cで。

関係演算子の結果は0または1です。1==1は に評価されることが保証され1、は に評価!(1==1)されることが保証され0ます。

最初の形式を使用する理由はまったくありません。ただし、ほとんどすべてのコンパイラで定数式が実行時ではなくコンパイル時に評価されるため、最初の形式の効率が劣るわけではないことに注意してください。これは、次の規則に従って許可されます。

(C99、6.6p2) 「定数式は、実行時ではなく変換中に評価できるため、定数が存在する可能性のあるあらゆる場所で使用できます。」

TRUEリテラル forおよびFALSEマクロを使用しない場合、PC-Lint はメッセージ (506、定数値ブール値) を発行します。

C の場合、TRUEは と定義する必要があります1。ただし、他の言語では 1 以外の数量を使用するため、一部のプログラマー!0は安全にプレイしていると感じています。

また、C99 では、stdbool.hブール値マクロの定義と リテラルtrueを直接使用します。false

#define true   1
#define false  0
于 2013-06-09T13:29:45.293 に答える
12

C++ (既に述べた) 以外に、静的解析ツールの利点があります。コンパイラは非効率性を排除しますが、静的アナライザーは独自の抽象型を使用して比較結果と他の整数型を区別できるため、TRUE が比較の結果である必要があり、互換性があると見なされるべきではないことを暗黙のうちに認識しています。整数で。

明らかに C は互換性があると言っていますが、バグを強調するためにその機能を意図的に使用することを禁止することを選択でき&ます&&

于 2013-06-09T17:41:57.043 に答える
4

実際の違いはありません。0に評価されfalse1に評価されtrueます。ブール式( 1 == 1) またはを使用し1て を定義trueしても、違いはありません。どちらも に評価されintます。

C 標準ライブラリには、ブール値を定義するための特定のヘッダーが用意されていることに注意してくださいstdbool.h

于 2013-06-09T13:25:39.577 に答える