アプリ版:「スタンプのみでお礼する」機能のリリースについて

超初心者のふつつか者です。^^;

Dim rc as Long
rc = DB_Sub_Select(SQL)
If rc Then …

以上のようにコードの一部がなっているのですが、rcはLong型と定義されているので、If rc Then との記述の中ではBoolean 型に自動的に型の変換がされていると考えていいのでしょうか。
また、Ifのあとは条件式が普通ですが、これは、rc=true の省略形なのでしょうか。
MSDNなど検索してみたのですが、うまくみつけられなかったです。

A 回答 (4件)

結論だけから言うと,既に2chさんが回答なさったとおりです。

C/C++やVBをはじめ,多くの言語で数値のゼロと論理のFALSEは同じものと取り扱えます。
ご質問はVBについてですが,例えばC言語ではTRUEやFALSEがもともと定義されていないので,“#define FALSE 0”(FALSEとは0のことである)とヘッダで定義してやることが多いです。そのくらい,コンピュータにとってゼロとFALSEは同じものなのです。
FALSEがゼロならば,FALSEでないもの,つまりTRUEは,ゼロでないもの,ということになります。またまた余談ですが,便宜上TRUEを-1と定義するプログラムがよくありますが,-1以外ゼロ以外の値がTRUEでないと判断される危険があるので私は好きでありません。正しいプログラムでは,ゼロでないすべての値がTRUEと扱われます。

型の意識が比較的薄いVBプログラミングにおいて,Boolean型に暗黙の型変換(キャスト)が起こっていると推測されたこと自体は,非常に良い考え方だと思います。
Javaのように(しか思いつきませんが),型にうるさい言語では,ご質問と同様のif文を書くと,まさにご質問の通り,“そこは論理型ぢゃい”というエラーが出ます。
将来の他の言語への展開(或いは他の言語からVBに入った方だったら失礼)も考えると,“型にうるさくない”VBを使うのであっても,kistuneさんが今後も“型にうるさい”人であり続けることをお奨めします。
    • good
    • 0
この回答へのお礼

由来も含めた丁寧な回答をありがとうございました。頑張ります。

お礼日時:2004/04/09 17:33

# ドしろうとの分際で専門家のコメントに補足するのは恐れ多いのですが......。



> 便宜上TRUEを-1と定義するプログラムがよくありますが

VB (6.0以前) でTrueが-1 (ゼロのビット反転) となるのは、AND / OR で論理演算とビット演算の両方を兼用させるための仕様と思われます。
このため、他のプログラミング言語では可能な「短絡評価 (ショートサーキット)」ができる演算子がVBには存在しません。

※ C言語では、論理演算子とビット演算子は別の演算子となっています。

If (条件式Left) And | Or (条件式Right) Then
といった条件文では、左辺式(条件式Left)の結果如何に関わらず、必ず右辺式(条件式Right)も評価されます。

プログラムの内容次第ではこれは、パフォーマンス (処理性能) に影響しかねないため、VB.NETでは短絡評価用の演算子 AndAlso, OrElse が追加されています。

また、VB.NET で Option Strict On (厳格なTypeチェック) を適用すると、暗黙の型変換に依存するコードはすべてビルドエラーとなります。
すなわち、

× If rc Then

    ↓

○ If CBool(rc) Then または
○ If rc <> 0 Then

と記述しなければなりません。


※ 余談ですが、Option Strict On を適用すると、抽象Object型を使用した実行時バインディングができない、というデメリットもあります。
(この問題は、適切なプログラム設計により回避可能かもしれません。専門家のフォローを希望)

参考URL:http://fukkey.dyndns.org/pins/vb/030228/45930.html
    • good
    • 0
この回答へのお礼

さらに詳しい説明をありがとうございました。

お礼日時:2004/06/14 19:16

>If rc Then との記述の中ではBoolean 型に自動的に型の変換がされていると考えていいのでしょうか。



はい。自動的にCBoolします。後はCBoolのヘルプを見れば分かります。
    • good
    • 0
この回答へのお礼

ありがとうございます。早速読んでみます。

お礼日時:2004/04/09 17:33

0=FALSE


!0=TRUE
    • good
    • 0
この回答へのお礼

そうなんですかー。シンプルな回答ありがとうございます。

お礼日時:2004/04/08 19:53

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!