2016-03-15 4 views
6

C++で比較演算子を使用する場合、boolはint型に変換されますか?比較中にC++のboolはintに変換されますか?

私が尋ねる理由は、常に明示的に比較するか否かの質問がで真/偽の文があれば、思いついたということです。 2つのオプションがあること:

1) if (my_bool == true) doSomething(); 
2) if (my_bool) doSomething(); 

私たちは、あなたが、一般的に次の理由の明示的な比較(1)を避ける必要があります考えていた:あなたが作業する必要がある場合は、上記のコードのような

int myFunc(){return 4;} 
if (myFunc() == true) doSomething(); 

何かが出てくるでしょう真であることを示すためにゼロ以外の値を返しているCインタフェースがあります。 myFunc戻り4、trueが1にmacro'd、及び4 == 1が真ではないので、myFunc()例はCで失敗します。

は、これはまだC++での場合ですか? "equal to"演算子は、boolをintに変換するのではなく、逆に変換しますか?標準への参照(C++ 11は私が扱っていることです)は高く評価されますが、言語のバージョンによって異なる場合は、知りたいと思うでしょう。

(私は明示的な真/偽比較の長所/短所について、具体的お尋ねしたいのですが、それは主観的な可能性のようなものがそうです。)

+0

'if(myBool == true)'が 'if(myBool)'よりも優れていると仮定すると、明らかに 'if((myBool == true)== true)'がさらに優れています。 – MSalters

答えて

8

C++で比較演算子を使用する場合は、変換boolsありますintに?

はい。通常の算術変換は、演算または列挙型のオペランドに対して行われる

:関係演算子([expr.rel]/5)について。等価演算子について

([expr.eq]/6):両方のオペランドは、算術演算または列挙型である場合、通常の算術変換は 両方のオペランドで実行され

両方のオペランドがboolある場合、それらは両方intに昇格されています。一方のオペランドがboolで他方が整数型の場合、boolオペランドはintに昇格します。 [expr]/10:

を参照してください。そうでない場合、積分プロモーション(4.5)は両方のオペランドに対して実行されます。

これまで私が知っていた限り、これは最初から当てはまりました(標準の改訂では違いはありません)。

私はどんな利益をもたらす方法で、それは冗長ではない考慮以来、私はtrueまたはfalseへの明示的な比較を行うための任意のパフォーマンスの意味合いがあるとは思わないが、私はそれを自分でしないだろう。

+0

ありがとう!私は、それぞれのアプローチの安全性と潜在的な落とし穴によって、私がパフォーマンスをあまり懸念しているわけではありません。 – josaphatv

+0

パーモランスは問題ではありません。コンパイラはブール値を十分に理解して、合理的なバリエーションを最適化します。 – MSalters

1

彼らは変換されません、ブール実際整数型です。

標準を参照してください:

「bool型の値が真か偽のどちらかである後述するように、ブール値はとして整数型を振る舞うbool型の値が整数プロモーションに参加。。」〜C++ 03

関連する問題