
変数宣言をしてその変数を使用する場合、ゼロクリアというのは常識なのかも知れませんが、フォートランはデフォルトでゼロクリアになっていたと理解しています。てっきりそうだと思っていたのですが、フリーのフォートランコンパイラ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も見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C++Builder → Visual C++ 移植...
-
組み込みソフト。ROM領域にデータ
-
エディタとコンパイラ 基礎
-
DLLの呼び出され方が分かりません
-
C言語の本!
-
COBOLの論理演算子について質問...
-
turbo-Cとturbo-C++
-
#pragma プリプロセス について
-
組込みC開発
-
COBOLのALPHABET...
-
DLLファイルの逆コンパイラにつ...
-
unsigned long long 型のフォー...
-
python エラー
-
<unistd.h>をVisualStudioでつ...
-
” OS ビルド ” の意味が分か...
-
ビルドとリビルドの違いを教え...
-
res://ieframe.dll/について
-
visual studio2019でデバッグが...
-
適切な変換関数が存在しない???
-
外部依存関係について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
DLLファイルの逆コンパイラにつ...
-
unsigned long long 型のフォー...
-
ソフトの開発言語を調べる方法
-
組み込みソフト。ROM領域にデータ
-
C++でデスクトップGUIアプリ開...
-
パーサとコンパイラの違いって?
-
【C言語】 型のサイズについて
-
COBOLのALPHABET...
-
<conio.h>?
-
printfなど、標準関数のソース...
-
COBOLの論理演算子について質問...
-
cc と gcc の違い
-
DLLの呼び出され方が分かりません
-
AIXとCOBOLについて
-
PICマイコンのプログラムカウン...
-
リリースモードとデバッグモー...
-
C++Builder → Visual C++ 移植...
-
C++DLLの明示的リンクに関して
-
cobolで実行環境って何ですか?
-
C言語の規格
おすすめ情報