解決済みの質問
Integer型の変数には、なんで、すでに意味不明な数値が入っているの?
c_crimerさん
Integer型の変数には、なんで、すでに意味不明な数値が入っているの?
*
delphiだけ?
Integer型の変数に、何も入れないと、4413292みたいな数字が出ますよね?
String型はまぁ、実体は配列だからアレだけど、Booleanだって、Falseが入っているのはまぁ、分かるんですが。
Integer型だって、0が入っていればわかりやすいのに。
- 補足
- 0とかnulなら、再帰の関数内で使えるのに。
if (iInt = 0) or (iInt = nul) then iInt = 0; //初期値を入れて、それ以外は無視。
にすれば、再帰の中でも使えるのに。
まぁ、再帰内で、iInt が0やnulにならないことが前提ですが。
-
- 質問日時:
- 2009/10/17 19:40:48
-
- 解決日時:
- 2009/10/23 21:49:12
-
- 回答数:
- 3
-
- 閲覧数:
- 459
-
- ソーシャルブックマークへ投稿:
- Yahoo!ブックマークへ投稿
- はてなブックマークへ投稿
- (ソーシャルブックマークとは)
ベストアンサーに選ばれた回答
happybsdさん
私は明示的に初期化する方がわかりやすいと思っているので、あまり不満に思っていません。
せっかく 0 入れても直後に別の値を入れられるならムダですよね。
初期化が必要なら、プログラマが明示すればいいじゃないというものです。
Delphi の場合、procedure や function の var で宣言する変数は
スタック領域に割り当てるため、明示的に初期化しない限り値は不定です。
integer に限りません。boolean や byte, double, レコード型でも同様です。
Delphi のご先祖の Turbo Pascal 以来の仕様です。
ただし、以下は例外です。
文字列型はかなり複雑な構造で、代入しない場合は空文字列として初期化されます。
実態はヒープ上に作成されるので、スタックの状態に影響されません。
可変長配列の場合も文字列に似た構造になるので、やはり初期状態は空です。
クラス型から生成するインスタンスはヒープにつくられるので、やはりスタックの状態に影響されません。
メンバ変数は0初期化されることになっています。
なお、メソッドのローカル変数は、スタック領域に確保されるので、不定になります。
このあたりの挙動は、用語や実装は違いますが C/C++ でも似てるように思います。
Fortran は自動ゼロ初期化が基本です。ご要望の仕様ですかね。
Basic も自動ゼロ初期化が基本のようです。
Microsoft Basic はどうなんでしょうね?
そういうわけで、未初期化変数の値をどうするかは言語設計者のこだわりポイントのようですが、
どっちが正しいというものではなさそうです。
- 違反報告
- 回答日時:2009/10/19 01:54:56
- この質問・回答は役に立ちましたか?
- 役に立った!
お役立ち度:
1人が役に立つと評価しています。
ベストアンサー以外の回答
(2件中1〜2件)
- 並べ替え:回答日時の
- 新しい順
- |
- 古い順
明示的に初期化するのはプログラマのマナーのひとつだ。
Cも変数を使う領域を初期化してくれないので、そこには何が入っているか分からないビックリ箱のお楽しみだ。
しかし、ガベージコレクションを導入している言語は予め設定したルールで初期化してくれる親切設計だ。
専ら.NETで開発する俺は・・・・・
初期化される仕様にもかかわらず、ついつい自分で初期値をいれてしまう癖がついている。
初期化の仕様が気に入らないなら、自分でクラスや構造体を定義してそれを使えば良いだけだ。
ラッパーとして設計すれば、使い勝手は元々の変数と同様に出来る。
ちなみに、.NETやJavaのString型は配列ではなく構造体であったりクラスであったりする。( 単純数値型ですらメソッドを持つ構造体なんだけどな・・・ )
実体が配列だと言えるのはCやC++ぐらいじゃないか?
でるふぁ? なんの託宣を受けるんだ?
そんな言語は知らん!
『 逆引きクロス大辞典 』 も知らん!!
- 違反報告
- 編集日時:2009/10/19 23:30:04
- 回答日時:2009/10/19 23:25:35


質問した人からのコメント
とはいえ、やはりクラスをつかえってことかな。
ありがとうございました。