3

C++ (スーパーセットではありませんが) がほとんど C から派生していることは誰もが知っています。

C++ では、演算子 <、<=、>、>=、==、および != はすべてブール型の戻り値を持ちます。ただし、C では「bool」型がなかったため、同じ演算子が 1 または 0 を返しました。

0 以外のすべての整数値は「真」として扱われ、0 は「偽」であるため、次のことを知りたいです。

C++ はまだ演算子の戻り値を 1 対 0 に制限していますか? または、これらの演算子の 1 つからの「true」は、0 でない限り、任意の 1 バイト値を返しますか?

これらの戻り値を明示的な 1 または 0 として使用すると、分岐のないビット単位の操作で役立つため、知りたいです。

ひどい例として、次の例を取り上げます。

bool timesTwo;
int value;

//...

if(timesTwo)
    value << 1;

//vs

value << (int) timesTwo;
4

3 に答える 3

5

C++ はまだ演算子の戻り値を 1 対 0 に制限していますか? または、これらの演算子の 1 つからの「true」は、0 でない限り、任意の 1 バイト値を返しますか?

比較演算子は、オーバーロードされていないと仮定すると、trueandのみを返しfalseます。

int(true)は常に 1 です。

int(false)は常に 0 です。

そう、

int one(1), two(2);
assert( (one<two) == 1 );
assert( (two<one) == 0 );
于 2012-10-26T21:37:37.090 に答える
2

実際、bool式で使用されると、C ++では自動的に整数に変換され(trueの場合は1、falseの場合は0)、キャストする必要はありません。

value << (int) timesTwo;

ケースは必要ありません。`timesTwo``がtrueの場合、

あなたはcasrなしで直接行うことができます:

value<<timesTwo;

これは次と同等です:

value<<1;
于 2012-10-26T21:52:20.433 に答える
0

この型boolには と の 2 つの値がfalseありtrueます。整数として扱うことができ、その場合、falseは 0 にtrue変換され、1 に変換されます。それだけです。

0 が false として扱われ、ゼロ以外が true として扱われる C スタイルのブール値の並べ替えは、誰かが単純に#define FALSE 0andのようなことを行うと問題を引き起こし#define TRUE !FALSEます。これは事実上TRUE1 として定義され、 のような比較if (f() == TRUE)は不思議なことに失敗する可能性があります。正しいテストはif (f() != FALSE). もちろん、実際のブール型では、false ではない値は常に同じであるため、これは問題ではありません。

于 2012-10-27T14:48:57.960 に答える