2

これが MS Visual Studio 2005 (およびおそらくその他) でコンパイルされていることを考慮してください。

CPoint point1( 1, 2 );
CPoint point2( 3, 4 );
const bool point1And2Identical( point1 == point2 );            // C4800 warning
const bool point1And2TheSame( ( point1 == point2 ) == TRUE );  // no warning

なに…?MSVC コンパイラは脳死状態ですか? 私が知る限り、TRUE は型情報なしで #1 として定義されています。では、これらの 2 つの行に違いがあるのは、どのような魔法によるのでしょうか? どちらの場合も、括弧内の式の型は同じですか? [質問のこの部分は、すぐ下のコメントで満足のいく回答が得られました]

個人的には、== TRUE オプションを使用して警告を回避するのは見苦しいと思います (厳密には != 0 の選択肢よりも見苦しくないですが)。 「私のコードは優れているが、コンパイラはお尻だ」とほのめかします。同意?

注 - C4800 に関するあらゆる種類の議論で、int を bool に代入することや、大きなフライド ポテト (タマネギを保持) を含むハンバーガー コンボを bool にキャストすることについて話しているのを見てきました。はるかに単純な質問のように見えるものについて、明確な答えが見つかりません...それは、一般的にC4800に一線を画すだけかもしれません。

4

3 に答える 3

3

これを見てください

通常、このメッセージは int 変数を bool 変数に割り当てることによって発生します。

TRUEおよびBOOLブール値ではなく int です。

(point1 == point2) != 0または使用するかどうかを確認することもできます!!(point1 == point2)

編集

!操作は単純に結果を bool に変換します。これは二重否定であるため、同じ結果が得られます。

これについては、こちらこちらの両方で以前に議論がありました。

于 2012-06-27T02:37:38.597 に答える
0

今私を満足させる答えはこれです:

組み込み型では、operator == は bool を返します (C++ 標準で必要)。

CPoint およびその他の多くの Microsoft の型の場合、演算子 == は Microsoft の BOOL を返します。これは int に typedef されます。

したがって、最初の const bool 代入行は int を const bool に代入しようとするため、C4800 になります。

2 番目の const bool 代入行は、int を値 TRUE と比較します。この値は 1 として typedef されます (コンパイラによって int と見なされます)。そのため、int == int 比較の結果は bool になります。これは、警告なしに const bool に割り当てられます。

画面上で最も見栄えのするものに関しては、#pragma は見苦しく、不必要です。余分な != 0 の外観が気に入らない場合は、これを試してください。

#define ISTRUE( x )  ( (x) != 0 )

const bool point1And3Identical( ISTRUE( point1 == point2 ) );    // no warning

意味的にも構文的にも、これはコードをきれいにするためのより良い方法のようです。ISTRUE() の #define をヘッダー ファイルに静かに押し込めば、見栄えがさらに良くなります。

于 2012-06-27T03:13:30.513 に答える
0

実際、ASSERT(point1 == point2) を使用しませんか? CPoint クラスの演算子は、ポイントが等しい場合はゼロ以外を返し、そうでない場合は 0 を返すように明示的にオーバーロードされます。有名な ASSERT マクロは私を殺しますが、ASSERT マクロがどのように展開されるかを見ると、上記の == TRUE をコードに追加するのとほとんど同じです。msdnのこのリンクを見てください。2 つの CPoint オブジェクトに対して等値演算子を直接使用しないことを明示的に示しているコード例に注意してください。あなたのコードが最も正しいように見えることに同意しますが、それが私たちが C++ を気に入っている理由です。うーん...

于 2012-06-27T02:34:52.013 に答える