
A 回答 (6件)
- 最新から表示
- 回答順に表示
No.6
- 回答日時:
> 変数はコードで初期化しなくても暗黙の初期化がされます。
(数値ならゼロ。文字列なら、長さゼロの文字列)Variant型はNullという特殊な値で初期化されます。
Object変数はNothing(C言語で言うところのNULLポインタ)で初期化されます。
以上、訂正。
No.5
- 回答日時:
他言語の場合の話を参考(になるかわかりませんが)までに・・・。
VBの場合、変数はコードで初期化しなくても暗黙の初期化がされます。(数値ならゼロ。文字列なら、長さゼロの文字列)
ですので、通常VBでは「初期化されていない」判定が必要になることはない(というより、VB6.0では、文法上、変数宣言時の初期化はできない)のですが、唯一の例外が省略可能な(Optional)引数であり、VB6.0以前の文法でも、この場合のみ、仮引数の宣言時に初期値の定義が可能となっています。
そして、省略可能である以上、処理内容により、実引数が渡されているか、否かを判定して処理を分岐する必要性が生じる場合があります。
前置きが長くなりましたが、このようなケースで引数の使用有無をどう判定するかというと、やはりNo.3さんのご指摘のように
> iが0以上の値を取るなら
> int i = -1 ;
> とでもしておけば
> if ( i == -1) {
> // 未代入
> }else {
> // 代入済み
> }
> と切り分けできます。
とするのが一般的です。
(Optional引数の存在有無を判定するのに、IsMissing関数というのも用意されていますが、個人的には好きではありません)
長くなりましたが、実装言語に依存せずに使用できる手法という観点から、No.3さんご提示の方法が無難と思われます。
No.4
- 回答日時:
状態変数(初期化されている or 初期化されていない)が必要です。
/* sample.c */
/* Int 構造体 */
typedef struct Int
{
BOOL bInit; /* 初期化状態 */
int iInit; /* 初期化値 */
};
/* Int : 未初期化状態に設定 */
void Int_Clear(Int* me)
{
me->bInit = FALSE;
me->iInit = 0;
}
/* Int : 初期化 */
void Int_Init(Int* me, int iInit)
{
me->bInit = TRUE;
me->iInit = iInit;
}
/* Int : 初期化状態の取得 */
BOOL Int_IsInit(Int* me)
{
return me->bInit;
}
/* Int : 初期化値の取得 */
int Int_GetInit(Int* me)
{
return me->iInit;
}
/* サンプル */
int main(int argc, char** argv)
{
Int i;
/* 変数 i を未初期化状態に設定 */
Int_Clear(&i);
if (!Int_IsInit(&i))
{
/* 初期化されていない場合 */
printf("ここは実行されます。\n");
}
/* 変数 i を 1 で初期化 */
Int_Init(&i, 1);
if (!Int_IsInit(&i))
{
/* 初期化されていない場合 */
printf("ここは実行されません。\n");
}
}
/* eof */
ここまでやる必要があるか解りませんが、参考になるといいですね。
No.3
- 回答日時:
iが取りうる値の範囲が決まっているなら、初期化で感以外の値を入れておく。
iが0以上の値を取るなら
int i = -1 ;
とでもしておけば
if ( i == -1) {
// 未代入
}else {
// 代入済み
}
と切り分けできます。
iの取りうる値の範囲が決まっていないなら、別の変数を用意して
int i , j = 0 ;
if (j == 0) {
// 未代入
j = 1 ;
}else {
// 代入済み
}
と切り分けます。
No.2
- 回答日時:
>このときiに値が代入されてない(初期化されていない)ときのみにある動作をさせたいのですが、うまくやる方法がわかりません。
無理です。
一般的に初期化されていない領域には何がはいっているかわかりません。
前に動いてたプログラムのゴミが入っているかもしれません。
値を参照する場合、初期化は必須です。
初期化しているかどうか確認するマクロを作る事は可能かもしれませんが
ナンセンスです。
最初に呼び出された時のみ初期化するstaticなどを使って工夫してください。
staticで明示的に指定しない場合0が入ります。
static int i;
No.1
- 回答日時:
変数の初期値はコンパイル時のオプションによっても異なります。
オプションにより、
(1)0にする
(2)指定した値にする
(3)初期化しない
となりますが、
(3)の場合は、なりゆきの値になります。
(確保した変数領域を前回使っていた最終値)
ですので、「初期化してある/してない」の判断は、単純には出来ませんね。
ご自身のコンパイルオプションをご確認の上、再検討してみてくださいね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript 変数宣言と初期値代入の場所について 3 2022/10/31 19:09
- デスクトップパソコン 40年間の悩み キーボードにおいて初期値として漢字ローマ字変換に設定する方法 8 2023/05/08 14:50
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- その他(プログラミング・Web制作) このプログラミングをどう組みますか? Googlecolabでやってるんですが、出来る方お願いします 1 2022/07/13 10:52
- Visual Basic(VBA) Excel のユーザー定義関数でソルバーが動作しない 1 2022/09/05 19:51
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- その他(プログラミング・Web制作) どういうプログラムで組みますか?google colabでやってるんですけど、出来る方お願いします。 1 2022/07/06 09:28
- 大学受験 合同式 1 2022/09/03 12:37
- PHP PHPSpreadsheetを使って関数を繰り返し埋め込みたい 1 2023/05/24 11:33
- C言語・C++・C# C++のcinの動作 5 2023/02/26 00:13
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAで変数定義を変更する方法
-
ビット演算について
-
C++でデータの途中から読み込み
-
16進数のバイト数
-
FORTRANのCOMMONについて
-
#pragmaについて
-
Schemeのコンストラクタの引数は?
-
この型変換の内容がわかりませ...
-
errorC2228 CColorDialog
-
C++変数宣言時のコンストラクタ...
-
C言語のプログラムの流れについて
-
ExcelVBAで初期値のセット
-
メッセージキュー
-
デフォルトコンストラクタで分...
-
「 VBA の 宣言 」 がない場合...
-
変数の初期化について
-
整数から16進数への変換 現在c...
-
Pythonです。 monster ballを定...
-
VBAのプログラムで、DIAG = 1# ...
-
文字列の検索&排除をするプロ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAのプログラムで、DIAG = 1# ...
-
Integer変数をカラにしたいので...
-
「#undef」と「#define」の使い...
-
C言語 構造体の中に共用体を定...
-
構造体のデータを丸ごとコピー...
-
VBAの変数のデータ型を変更する...
-
日付チェック関数について
-
整数から16進数への変換 現在c...
-
typedefをプログラム中で解除す...
-
値が代入されてない時
-
C++ 構造体の一括初期化 {0}
-
VBAで符号無し整数
-
long型のデータをバイト型の配...
-
変数の初期化について
-
1バイトデータの読み出しについて
-
charとucharの違い
-
VBAにてcolorindexを変数に格納...
-
異なる構造体のデータのコピー
-
構造体を型の異なる構造体に代入
-
構造体にする理由・利点・使用例
おすすめ情報