変数宣言をしてその変数を使用する場合、ゼロクリアというのは常識なのかも知れませんが、フォートランはデフォルトでゼロクリアになっていたと理解しています。てっきりそうだと思っていたのですが、フリーのフォートランコンパイラg95はゼロクリアになっていないみたいです。すなわちg95では変数宣言して値を明示的に与える前に使用するとゼロと思っていたのがとんでもない値になっていました。
コンパイラの仕様を読んでおくというのは数値計算を行う上で重要なことだと考えます。
前置きが長くなりました。質問ですが、コンパイラで変数宣言した時点でゼロクリアになっていないというのは言語としてはどのようなものがあるのでしょうか? 全部なのでしょうか。全部そうだと思っていた方が安全ではあると思いますが。
よろしくお願いします。
A 回答 (4件)
- 最新から表示
- 回答順に表示
No.4
- 回答日時:
C# や Java等の安全重視の最近の言語では0,nullなどでの初期化が保証されます。
CやC++など、性能重視の従来の言語では、無駄な初期化は保証されません。
# C/C++の静的変数など、一部保証されるケースもあります。
したがって、プログラマの判断/責任において最適な初期化をすることになりますが、
メモリやスピードを過度に要求されるコードでもない限り、
昨今は明示的に初期化して使われる方が多いのではないかと思います。
また、仕様上保証がないだけであって、他の方も書かれているように、
コンパイラによっては初期化保証などを行っているものもありえますが、
あくまでそのコンパイラの独自拡張機能となります。
回答、有難うございました。
Cの本などを見ると必ず初期化しているようで、言語の違いについて考えさせられました。これからはフォートランでもしっかり初期化しようと思います。
No.3
- 回答日時:
ANSIのFORTRANの言語仕様では初期値は保証されていない筈です。
コンパイラやOSによっては保証している場合もあるかと思いますが、それはイレギュラーだし、それに頼る行為は信頼に欠けるプログラミングです。
なお、処理系によっては、整数のゼロと実数のゼロは違うし、実数のゼロとしてNULLと仮数部ゼロ、指数有りの複数を認める処理系もあります。ですから、ゼロクリアだったとしても、ヌルなのか浮動小数点表示のゼロなのかで結果が違う場合もあります(論理式に突っ込んだ場合など)。
なお、DATA文で初期化した場合と、ループで初期化する場合とでは変数の置かれる場所が違ったり、最適化による効果が異なりますのでいろいろ試してみるのは面白いです。
なお、ゼロクリアが保証されないのは、初期のコンピュータにおいては主記憶が磁気コアや磁気ドラムなどに置かれ、領域を確保しただけでは自動的にクリアできなかったことなどが影響しています。サブルーチンや関数内の変数も一旦サブルーチンから出て戻った場合、SAVE文で保持を指定しないと不定に戻る使用でした(これは現在は保証される)。
ゼロクリアを言語仕様として決めているのは一部のインタープリタくらいじゃないかな。実際にはクリアされている処理系は結構あると思うけど。
言語仕様に従ってプログラムすれば、それに準拠したコンパイラでは少なくともそれは含んでいますから問題はないはず。
回答、有難うございました。
ソースプログラムはどこの環境にも持って行けるのですが、そこで正常に動作するかどうかはしっかり確認する必要があると思いました。
No.1
- 回答日時:
メジャーどころではCでしょうか。
プログラマが指定していないのに、ゼロやNULLをセットするというのは、実行速度の低下を招くだけなので、初期値セットはプログラマに任せる言語が主流だと思いますが。
変数に型のない言語だと、何らかの型の値での初期化がされていると思います。
fortranもfortran90の規格は知らないですけど、fortran66や77では初期化が必須でした。
有難うございました。
フォートランでの科学計算ですので、作りこんで行くとCPU時間1時間というのはざらです。計算を始めた時点でのゼロセットはトータルの時間ではあまり問題にはならないと考えています。
g95とvisual Fortran(両者ともfortran90対応)でも初期のゼロセットは異なるようです。
ケースバイケースのようですね。一方、ソースプログラムはどこにでも持っていけるのでトラブルが発生するかも知れません。
要注意と思った方が良いみたいですね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
高校生はアルバイトするべきだろうか?賛成だったら「賛」、否定だったら「否」を文頭においてあなたの意見を教えてください。
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
「ゼロクリアする」とはどういう意味でしょうか。
日本語
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
unsigned long long 型のフォー...
-
ソフトの開発言語を調べる方法
-
変数の内容がコロコロ変わる、...
-
C言語のプログラミングのソフト...
-
C言語はC言語でできている?
-
C言語の関数の中身のソースコー...
-
パーサとコンパイラの違いって?
-
main() 関数は、int を返値とす...
-
Σの計算について
-
volatile修飾子について
-
24bit サイズの変数
-
C++Builder → Visual C++ 移植...
-
python エラー
-
<unistd.h>をVisualStudioでつ...
-
VBAを何回も作り直して、容量が...
-
アプリケーションのDLLファイル...
-
エクセルのエラーメッセージ「4...
-
” OS ビルド ” の意味が分か...
-
実行後にコンパイルに失敗しま...
-
<math.h>があるのにsqrtが・...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
unsigned long long 型のフォー...
-
ソフトの開発言語を調べる方法
-
C++Builder → Visual C++ 移植...
-
COBOLのALPHABET...
-
printfなど、標準関数のソース...
-
パーサとコンパイラの違いって?
-
cc と gcc の違い
-
組み込みソフト。ROM領域にデータ
-
リリースモードとデバッグモー...
-
変数の内容がコロコロ変わる、...
-
PICでのI2C通信でのマスタ、ス...
-
C++でデスクトップGUIアプリ開...
-
組込みC開発
-
プログラマーに向いている人の...
-
最初に使う変数のゼロクリアに...
-
未使用引数の注意文出力を回避...
-
main() 関数は、int を返値とす...
-
COBOLの論理演算子について質問...
-
cudaのnvccはmingwやgccでも使...
-
オープン系とか、組込み系とか...
おすすめ情報