3

次のコードがある場合:

int a = 1;
bool b = 1;

aはbに等しいですか?プログラムでさえ同じであると返されるかもしれませんが、それらは実際にはすべての面で低レベルで等しいのでしょうか?

また、次のようなコード(疑似)を使用する場合:

if (a)
then execute();

実行さexecute()れますか?私は理論的な答えを求めていますが、これは自然科学ではないため、実験で自分を納得させることはできません。皆さん、ありがとうございました。

4

4 に答える 4

10

私はあなたが正しい実験であなた自身を納得させることができると思います:

#include <type_traits>

int main() {
    int a = 1;
    bool b = 1;
    static_assert(! std::is_same<decltype(a), decltype(b)>::value,
                  "No, they are not the same on all aspects");
}

おそらく、2つの間の最も重要な違いは、2つのbool値しか持てないことです。これの結果を示す別の実験は次のとおりです。truefalseint

#include <cassert>

int main() {
    int a = 2;
    bool b = 2;
    assert(a != b);
}

2つのタイプの間には暗黙の変換があるため、2つのタイプは類似しているように見える場合があります。ゼロであるすべての積分式は暗黙的にに変換できfalse、ゼロではないすべての積分式は暗黙的にに変換できますtrue。反対方向でfalseは、暗黙的にゼロにtrue変換し、1に変換することができます。これにより、上記のコードは2!=1の場合にテストされることになります。

execute();これで、質問のスニペットでが呼び出されるかどうかという質問に対する答えは明らかです。値はステートメントでaにa変換され、ゼロではないため、に変換されて、が呼び出されます。booliftrueexecute()

于 2012-07-06T01:05:44.300 に答える
5

ゼロ以外の数値式またはポインター式はtrue、ブールコンテキストで使用された場合に評価されます。同様に、ゼロ式はに評価されfalseます。ただし、anintとaboolはタイプが異なるため、同じではありません。

于 2012-07-06T01:09:44.760 に答える
4

aはbに等しいですか?プログラムでさえ同じであると返されるかもしれませんが、それらは実際にはすべての面で低レベルで等しいのでしょうか?

それはすべて、あなたが等しいとはどういう意味かによって異なります。タイプが異なるため、メモリ内の表現がおそらく異なることを意味します(コンパイラは、これら2つをまったく同じものとして自由に表現できますが、それ以外の場合も自由に表現できます)。ほとんどのコンパイラ/アーキテクチャでboolは、1バイトのストレージしか使用せずint、サイズも大きくなります(通常は4バイトですが、これはアーキテクチャによって異なります)。

サイズが異なることに加えて、コンパイラは両方のタイプを異なる方法で処理します(メモリへのロードと格納だけでなく、操作も異なります。ブール値には0と1しか格納できません。つまり、一部の操作ではそれを使用する可能性があります。たとえば、この記事では、条件のテストの実装が異なる1つのケースがあります(この記事には、aboolが両方に評価されるtrue未定義の動作のケースがありfalse、コンパイラが想定しているテストについては注意してください)。は0または1のいずれかのみであり、 )boolでは発生しません。int

論理的な観点から、言語はさまざまな型が操作でどのように使用されるかを決定します。特に、プログラムで比較しようとすると、式の結果はになりaます。それらが完全に同じであることを意味するわけではないことに注意してください。言語は、両方の変数を同じ型に変換するために使用される一連の変換ルールを定義し、比較はその型で実行されます。この場合、変換はになります。変数はifまたはifに変換されます。btrueintbool0false1true

また、次のようなコード(疑似)を使用するif (a) execute()と、execute()が実行されますか?

はい。この場合、内部の条件には値ifが必要boolであるため、変換はからintになりboolます。falseこの標準では、整数値が、である場合0、またはtrueそれ以外の場合は、実質的に。と同等の処理を行う場合に生成される変換が定義されていif (a!=0)ます。aであるため1、条件が成立し、execute()評価されます。

于 2012-07-06T01:30:50.357 に答える
1

このスレッドでは、charと比較したc ++ブール値について説明していますが、内部で何が起こっているかについての良いアイデアが得られます。C ++でcharとboolが同じサイズであるのはなぜですか?

于 2012-07-06T01:12:50.003 に答える