2012-01-01 12 views
3

私はC++を学んでいます。私は、.NETとVB6の背景から来ています。VB6とC++ブールリテラル

私は、次のWebページは、ブール値について言っていることについて興味をそそられています:http://msdn.microsoft.com/en-us/library/ff381404(v=vs.85).aspx

すなわち「TRUEのこの定義にもかかわらず、しかし、BOOL型を返すほとんどの関数はブール値を示すためにゼロ以外の値を返すことができます。真実したがって、あなたは常にこのことを書く必要があります。

// Right way. 
BOOL result = SomeFunctionThatReturnsBoolean(); 
if (result) 
{ 
    ... 
} 

これはVB6にも当てはまりますか?すなわち、If BooleanValue = True Thenという問題がありますか?

+0

残念ながら、このガイドラインに従うと、 'int'から' bool'への暗黙的な変換について多くの警告が発生する傾向があります。 –

+0

関連:[論理的でないVBScript](http://blogs.msdn.com/b/ericlippert/archive/2004/07/15/184431.aspx)、Eric Lippert著(VBScriptとVB6の違いはこの特定のケースでは関係ありません) –

答えて

8

Windows APIは、Cプログラムから使用するように設計されています。 C99まではブールタイプがありませんでした。それでも、完全にはならないC99は、たとえばMicrosoftコンパイラによって実装されたことはありません。そこで、彼らは、Cコンパイラが論理的価値を扱う方法と高度に互換性のある回避策を考え出す必要がありました。 intが0の場合はfalse、それ以外の場合はtrueです。従ってアドバイス。

VB6には、リテラル値TrueおよびFalseのための専用のブール型およびキーワードがあります。したがって、同じ問題はありません。ただし、COMサーバーの記述が不十分な場合でも問題は発生します。 Trueの基礎となる整数値は-1であり、他の多くの言語の論理ブール型の実装とは非常に互換性がありません。 C.を含んでいるVB6が奇妙なことである正当な理由があります、そのAndとOr演算子は論理と算術および/またはを区別しません。 Trueを-1に、Falseを0に設定することで違いはありません。 COMサーバーがVARIANT_TRUEではなくTRUEを示す1を返すと、問題が発生することがあります。

しかし、とりわけ、If booleanVariable = True Thenを書くことは、多くのプログラマーのための黒板にちょうど醜いです。 If booleanVariable Thenと書いてください。

+1

+1、それを爪。技術的背景もよく説明されています。 –

+0

ハンス、なぜ書くか説明できますか: "If booleanVariable = True Then"は醜いですか?また、COMサーバーがブール値の整数を返さない場合、つまり常にリテラル、つまりTRUEまたはFALSEを返す場合は、問題はありません。 VB6 COMコンポーネントはVB6クライアントでのみ使用されます。ありがとうございました。 – w0051977

+1

余計なのでです。それを動作させるためにそこにいる必要はないコードを書くことには意味がありません。 COMサーバーは、通常C++で書かれています。それは*真*リテラルを持っていますが、それは間違った値を持っています、したがって問題です。明らかに、サーバーがVB6で実装されていれば、まったく問題はありません。 –

2

VBでは、いいえ、True/Falseは実際のブール値です。ただし、C/C++ではBOOLは#の定義がintなので、BOOL変数には任意の整数値を割り当てることができます(Cでは#defineが1(通常)、FALSEが#defineが0)。

VBエクスペリエンスとのオーバーラップをよくするには、boolデータ型をC++で使用し、実際にはtrue/falseの値を使用します。

編集:もちろん、VBではIf BooleanValue = TRUEと言います。 C++では、同等のは、(代入演算子ある=とは反対に、比較演算子である==を、注意してください)if (BooleanValue == true)ですが、Cで、あなたは== true比較をスキップしてちょうどif (BooleanValue)を使用することができ++。

+0

"普通"のステートメントを明確にするために:#define FALSE 0'と '#define TRUE!FALSE'を使ったプロジェクトを見ました。 。 –

+0

ニック、記事で、それは使用しないと言うIf BooleanValue == True?あなたの答えでは、VB6でBooleanValue = Trueの場合は、If BooleanValue == TrueをC++で記述するのと同等であると言います。 #define on 1の意味を明確にすることはできますか?これは、値2がfalseを返すことを意味しますか?ありがとう。 – w0051977

+0

はい、 'if(BooleanValue == TRUE)'を実行し、BooleanValueが実際には2であれば失敗しますので、代わりに 'if(BooleanValue)'を使用することをお勧めします。 –