変数宣言をしてその変数を使用する場合、ゼロクリアというのは常識なのかも知れませんが、フォートランはデフォルトでゼロクリアになっていたと理解しています。てっきりそうだと思っていたのですが、フリーのフォートランコンパイラ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で質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) Excel マクロで For 文のインデックスを先に宣言する理由 7 2022/08/27 00:26
- 高校 対数方程式につきまして 4 2022/05/05 07:55
- HTML・CSS WEBサイトの構築。表示データとWEBデザインを分離する考え方を専門用語・業界用語では何と言うか? 8 2022/09/27 09:16
- Ruby 初心者プログラミング 3 2022/10/12 11:31
- 数学 モデルのパラメータの定義がいまいちわかりません。 3 2022/10/11 15:16
- Excel(エクセル) マクロだと数式が表示される 2 2022/09/10 14:48
- Visual Basic(VBA) Excel のユーザー定義関数でソルバーが動作しない 1 2022/09/05 19:51
- ゲーム ゲームの縛りプレイの何が楽しいのかわかりません。一人で勝手にルール決めてクリアして喜んだって、それっ 5 2022/09/02 16:43
- その他(ソフトウェア) googleスプレッドシートのキャッシュを自動で消したい 1 2023/01/30 12:05
- C言語・C++・C# 変数の初期化について 5 2022/10/02 08:55
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
unsigned long long 型のフォー...
-
main() 関数は、int を返値とす...
-
ソフトの開発言語を調べる方法
-
C++でデスクトップGUIアプリ開...
-
<conio.h>?
-
PICのCコンパイラーについて
-
プログラミングって右脳よりの...
-
COBOL計算式の中間ワーク桁数に...
-
printfなど、標準関数のソース...
-
リリースモードとデバッグモー...
-
組込みC開発
-
COBOLの論理演算子について質問...
-
COBOLのALPHABET...
-
C言語 main関数とsum関数の記...
-
未使用引数の注意文出力を回避...
-
初心者です C言語を学びたいで...
-
C++Builder → Visual C++ 移植...
-
C言語で画像を出力したい
-
python エラー
-
エクセルのエラーメッセージ「4...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
unsigned long long 型のフォー...
-
ソフトの開発言語を調べる方法
-
C++でデスクトップGUIアプリ開...
-
printfなど、標準関数のソース...
-
組み込みソフト。ROM領域にデータ
-
リリースモードとデバッグモー...
-
変数の内容がコロコロ変わる、...
-
cc と gcc の違い
-
COBOLの論理演算子について質問...
-
Visual Studio でmakefileを使...
-
PICでのI2C通信でのマスタ、ス...
-
COBOLのALPHABET...
-
<conio.h>?
-
VB6のコンパイラ
-
COBOL計算式の中間ワーク桁数に...
-
パーサとコンパイラの違いって?
-
関数形式マクロ dtaは戻り値が...
-
プログラミングって右脳よりの...
-
C++Builder → Visual C++ 移植...
-
24bit サイズの変数
おすすめ情報