次のコードがある場合:
int a = 1;
bool b = 1;
aはbに等しいですか?プログラムでさえ同じであると返されるかもしれませんが、それらは実際にはすべての面で低レベルで等しいのでしょうか?
また、次のようなコード(疑似)を使用する場合:
if (a)
then execute();
実行さexecute()
れますか?私は理論的な答えを求めていますが、これは自然科学ではないため、実験で自分を納得させることはできません。皆さん、ありがとうございました。
私はあなたが正しい実験であなた自身を納得させることができると思います:
#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
値しか持てないことです。これの結果を示す別の実験は次のとおりです。true
false
int
#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
変換され、ゼロではないため、に変換されて、が呼び出されます。bool
if
true
execute()
ゼロ以外の数値式またはポインター式はtrue
、ブールコンテキストで使用された場合に評価されます。同様に、ゼロ式はに評価されfalse
ます。ただし、anint
とabool
はタイプが異なるため、同じではありません。
aはbに等しいですか?プログラムでさえ同じであると返されるかもしれませんが、それらは実際にはすべての面で低レベルで等しいのでしょうか?
それはすべて、あなたが等しいとはどういう意味かによって異なります。タイプが異なるため、メモリ内の表現がおそらく異なることを意味します(コンパイラは、これら2つをまったく同じものとして自由に表現できますが、それ以外の場合も自由に表現できます)。ほとんどのコンパイラ/アーキテクチャでbool
は、1バイトのストレージしか使用せずint
、サイズも大きくなります(通常は4バイトですが、これはアーキテクチャによって異なります)。
サイズが異なることに加えて、コンパイラは両方のタイプを異なる方法で処理します(メモリへのロードと格納だけでなく、操作も異なります。ブール値には0と1しか格納できません。つまり、一部の操作ではそれを使用する可能性があります。たとえば、この記事では、条件のテストの実装が異なる1つのケースがあります(この記事には、abool
が両方に評価されるtrue
未定義の動作のケースがありfalse
、コンパイラが想定しているテストについては注意してください)。は0または1のいずれかのみであり、 )bool
では発生しません。int
論理的な観点から、言語はさまざまな型が操作でどのように使用されるかを決定します。特に、プログラムで比較しようとすると、式の結果はになりa
ます。それらが完全に同じであることを意味するわけではないことに注意してください。言語は、両方の変数を同じ型に変換するために使用される一連の変換ルールを定義し、比較はその型で実行されます。この場合、変換はになります。変数はifまたはifに変換されます。b
true
int
bool
0
false
1
true
また、次のようなコード(疑似)を使用する
if (a) execute()
と、execute()が実行されますか?
はい。この場合、内部の条件には値if
が必要bool
であるため、変換はからint
になりbool
ます。false
この標準では、整数値が、である場合0
、またはtrue
それ以外の場合は、実質的に。と同等の処理を行う場合に生成される変換が定義されていif (a!=0)
ます。a
であるため1
、条件が成立し、execute()
評価されます。
このスレッドでは、charと比較したc ++ブール値について説明していますが、内部で何が起こっているかについての良いアイデアが得られます。C ++でcharとboolが同じサイズであるのはなぜですか?