ここから本文です

解決済みの質問

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にならないことが前提ですが。

違反報告

ベストアンサーに選ばれた回答

happybsdさん

私は明示的に初期化する方がわかりやすいと思っているので、あまり不満に思っていません。
せっかく 0 入れても直後に別の値を入れられるならムダですよね。
初期化が必要なら、プログラマが明示すればいいじゃないというものです。

Delphi の場合、procedure や function の var で宣言する変数は
スタック領域に割り当てるため、明示的に初期化しない限り値は不定です。
integer に限りません。boolean や byte, double, レコード型でも同様です。
Delphi のご先祖の Turbo Pascal 以来の仕様です。

ただし、以下は例外です。

文字列型はかなり複雑な構造で、代入しない場合は空文字列として初期化されます。
実態はヒープ上に作成されるので、スタックの状態に影響されません。

可変長配列の場合も文字列に似た構造になるので、やはり初期状態は空です。

クラス型から生成するインスタンスはヒープにつくられるので、やはりスタックの状態に影響されません。
メンバ変数は0初期化されることになっています。
なお、メソッドのローカル変数は、スタック領域に確保されるので、不定になります。

このあたりの挙動は、用語や実装は違いますが C/C++ でも似てるように思います。

Fortran は自動ゼロ初期化が基本です。ご要望の仕様ですかね。

Basic も自動ゼロ初期化が基本のようです。
Microsoft Basic はどうなんでしょうね?

そういうわけで、未初期化変数の値をどうするかは言語設計者のこだわりポイントのようですが、
どっちが正しいというものではなさそうです。

質問した人からのコメント

  • おー、変数なんて実に当たり前に宣言しているものだけど、意外と奥が深そうですね。
    とはいえ、やはりクラスをつかえってことかな。
    ありがとうございました。
  • コメント日時:2009/10/23 21:49:12

アップロード写真

この質問・回答は役に立ちましたか?
役に立った!

お役立ち度:お役立ち度 1点(5点満点中)1人が役に立つと評価しています。

ベストアンサー以外の回答

(2件中1〜2件)

並べ替え:回答日時の
新しい順
古い順

 

lotomangiatoreさん

明示的に初期化するのはプログラマのマナーのひとつだ。

Cも変数を使う領域を初期化してくれないので、そこには何が入っているか分からないビックリ箱のお楽しみだ。
しかし、ガベージコレクションを導入している言語は予め設定したルールで初期化してくれる親切設計だ。

専ら.NETで開発する俺は・・・・・
初期化される仕様にもかかわらず、ついつい自分で初期値をいれてしまう癖がついている。



初期化の仕様が気に入らないなら、自分でクラスや構造体を定義してそれを使えば良いだけだ。
ラッパーとして設計すれば、使い勝手は元々の変数と同様に出来る。



ちなみに、.NETやJavaのString型は配列ではなく構造体であったりクラスであったりする。( 単純数値型ですらメソッドを持つ構造体なんだけどな・・・ )
実体が配列だと言えるのはCやC++ぐらいじゃないか?

でるふぁ? なんの託宣を受けるんだ?
そんな言語は知らん!

『 逆引きクロス大辞典 』 も知らん!!

  • 違反報告
  • 編集日時:2009/10/19 23:30:04
  • 回答日時:2009/10/19 23:25:35

iespyadさん

1. 言語規定がそうだから
2. あほコードを書けないように
3. 文脈によっては無駄なオーバーヘッドになるから
4. x86 CPUのスタックの仕様

この質問に付けられたタグ

タグとは

知恵ノートとは?

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。

お客様自身の責任と判断で、ご利用ください。

話題のキーワード

[カテゴリ:プログラミング]

ただいまの回答者

02時44分現在

1726
人が回答!!

1時間以内に3,087件の回答が寄せられています。

>>回答ひろばに行く


知恵コレに追加する

閉じる

知恵コレクションをするID/ニックネームを選択し、「追加する」ボタンを押してください。
※知恵コレクションに追加された質問や知恵ノートは選択されたID/ニックネームのMy知恵袋で確認できます。

ほかのID/ニックネームで利用登録する