小池啓仁 ヒロヒト応援ブログ By はてな

小池啓仁(コイケヒロヒト)の動画など。

小池啓仁 ヒロヒト応援ブログ By はてな

VBとC言語で、Nullにまつわる話し

まず、C言語でのNULLは、

#define NULL 0
あるいは
#define NULL ((void*)0)
です。

また、nul文字('\0')というのもあります。
あと、空文字列("")というのもあります。
しかし、これは、空文字列といっても、目には見えませんが実は、nul文字が一文字格納されています。
ちなみに、VBでの空文字列は、nul文字は入っていなく本当に空です。


一方、VB6でのNullは、主にDBでのNullを表すものらしいです(以下MSDNから引用)。
ちなみに、DB上のNullとは、値でも変数でもなく、何もない状態をいいます。

Null 値
Null 値も、バリアント型 (Variant) 変数に格納できる特殊な値の 1 つです。Null 値は、データベース アプリケーションなどで、未入力データなどを表すときに使います。Null 値には次のような特徴があるので、データベース処理に利用すると便利です。


式の中に Null 値が含まれる場合、計算結果は常に Null 値になります。このような Null 値の特性を、"Null 値は式に対する透過性がある" といいます。式の中のいずれかの部分が Null 値と判断されれば、式全体が Null 値と評価されます。


Null 値、Null 値が格納されたバリアント型変数、Null 値と評価される式のいずれかを引数として関数に渡すと、ほとんどの関数は Null 値を返します。


Null 値は、バリアント型を返す組み込み関数に対しても透過性を持っています。
変数に Null 値を代入するには、Null キーワードを使います。

Z = Null

バリアント型変数に Null 値が格納されているかどうかを調べるには、IsNull 関数を使います。

If IsNull(X) And IsNull(Y) Then
   Z = Null
Else
   Z = 0
End If

Null 値を、バリアント型以外のデータ型の変数に代入すると、トラップできるエラーが発生します。一方、Null 値をバリアント型変数に代入した場合にはエラーは発生しません。Null 値が代入されたバリアント型変数を式の中で使うと、Null 値は式に対して透過性があるため、その式の結果は Null 値になります。ただし、関数によっては、Null 値を使っても結果が Null 値にならないものがあります。バリアント型の値を返す Function プロシージャを記述するときは、Null 値を返すようにすることができます。

変数には、明示的に Null 値を代入しない限り、Null 値が格納されることはありません。したがって、Null 値を使わないアプリケーションを記述するときは、Null 値が格納されているかどうかを調べたり、Null 値を処理したりするコードを記述する必要はありません。

まとめると

C言語でのNULLは、『0』または、『(void*)0』です。
C言語でのnul文字は、『'\0'』です。
C言語での空文字列は、nul文字が一つ格納されている『""』です。


VB6でのNULLは、バリアント型変数にのみ格納でき、未入力データなどを表すものです。
VB6でのnul文字は、vbNullChar です。
VB6での空文字列は、nul文字が格納されていない『""』です。


VB2005でのNULLは、オブジェクト系ではNothing、データベース系ではDBNullです。
VB2005でのnul文字は、ControlChars.NullChar です。
VB2005での空文字列は、nul文字が格納されていない『""』です。


VB6でのC言語に対応する NULL は、vbNullString です。
VB6でのC言語に対応する nul文字 は、vbNullChar です。
VB6でのC言語に対応する 空文字列 は、"" & vbNullChar です。


VB2005でのVB6に対応する vbNullString は、Nothing です。
VB2005でのVB6に対応する vbNullChar は、ControlChars.NullChar です。
VB2005でのVB6に対応する 空文字列 は、同等のものです。
参考:http://msdn2.microsoft.com/ja-jp/library/3h0567he(vs.80).aspx


ちなにみ、vbNullStringはVBでは以下のように定義されています。

vbNullStringは、値 0 を持つ文字列で、 長さ 0 の文字列 ("") とは異なり、外部プロシージャを呼び出す場合に使用する。

よって、APIの引数に渡す時、C言語でNULLで渡すものは、VB6ではvbNullString、VB2005ではNothing。
C言語で文字列を渡すものは、VB6では文字列の最後に&演算子で『vbNullChar』を連結し、VB2005では『Nothing』を連結する。