
No.4ベストアンサー
- 回答日時:
いや, いくらなんでも「古い規格の問題」はないと思います. #1 で指摘されている「最適化のしすぎ」というバグの可能性はあると思いますが, さすがにこの程度なら「普通に想定できる」挙動しかしないはずです.
#1 の指摘はぶっちゃけバグなので, 「初期化のときには問題だが代入では期待した通り」ということがあってもおかしくはありません.
ご指摘ありがとうございます。早合点してしまいました。
やはり、コンパイラのバグという線が有力ですかね。しかし、本当にそんなバグを持ったコンパイラがあったのか……、謎ですね。

No.5
- 回答日時:
No.2で回答した者です
> この現象について話していた人に再び聞いてみました。それによると、宣言時に代入した場合、
> 変数の値はコンパイラ依存となり、不定となることがあるらしいです。
私も、年齢的には、話の大元の方と近い物がありますが、このような現象は聞いたことは無いですね。
よくは分かりませんが、何らかの目的で、言語仕様と異なる仕様の処理系があったということなのか、単にバグのある処理系での話ってことなんですよね。
回答ありがとうございます。
うーん、明確な原因は分からないままですね。確実なことは、「過去にたまたまそういう事例があっただけで、特に気にする必要はない」というぐらいでしょうか。
No.3
- 回答日時:
少なくとも「現在の C++ の規格に従っている処理系」であれば問題ありません.
そもそも規格の中に「関数の返り値によって初期化している」例がある.
回答してくださり、ありがとうございます。
なるほど、コンパイラではなく、実は古いC++の規格が問題だったという可能性もありますね。だとすると、戻り値で初期化したときの変数値を意識したプログラミングは、必要ないような気がしてきました。

No.2
- 回答日時:
質問に対して質問をして大変申し訳ないです
1)この現象は、特定の環境で発生するのでしょうか?
特定のOS、特定のコンパイラ/リンカ、またはコンパイラやリンカのオプション等
2)予期せぬ動作とは、正常動作の中での不整合でしょうか?
例えば、一見正常動作しているが、実行後のfの戻り値とaの値が不一致等
3)もしくは、例外が発生したり、プログラムが異常終了してしまうとかでしょか?
上記のようなコードで、特に問題になった記憶がないのでチョット気になり質問しました。
ただ、言語仕様上は問題ないと思うので、コンパイラのバグ等も考えられるかもしれないですね。
思いつくのは、スタックが足りなくて自動変数aの領域や、fの呼び出しに失敗している場合。
ただ、この場合だと自動変数の宣言、もしくは関数呼び出しのどちらかだけでもアウトですね。
この回答への補足
この現象について話していた人に再び聞いてみました。それによると、宣言時に代入した場合、変数の値はコンパイラ依存となり、不定となることがあるらしいです。しかし、どのコンパイラでその現象が起きたのかは覚えていないとのこと。
推測ですが、その人は40代ぐらいなので、古いコンパイラなのだと思います。ちなみに、私が使用しているVC++2005では問題なく動作します。
なぜ私がここで質問したかというと、ほかにも同様の現象を体験している方がいるのか知りたかったからです。そのため、もう何日間かは回答を受け付ける状態にしておきます。
No.1
- 回答日時:
私が25年くらい前に経験した事象は以下の通りです。
int a = f();
int b = f();
関数fは乱数や時刻要素から戻り値を得るものです。
よって、a != b が期待値ですが、a == b になりました。
この時、最適化をマックスにしてありました。
機械語を調べると、aに代入する時はfを呼び出して
いますが、bへの代入時には前の戻り値を流用しており、
関数は呼び出していませんでした。最適化を抑制すると、
当然ながら事態は改善されました。
当時は関数の行数やメモリ量により、最適化が微妙に
変化したのですが、最近ではメモリ量が飛躍的に増加
しており、代々の改良で誤動作を起こす確率も減ったと
思われます。尚、変数の定義と初期化のみならず、
最適化を最大にして、ステップ数の多いルーチンを
コンパイルした場合に危険が伴うようです。
回答してくださり、ありがとうございます。
一点だけ気になるのが、nda23さんによる説明だと、宣言のとき以外の代入でも同様の現象が起きるように思われます。私が聞いた内容は、初期化(宣言のときに代入)によって起こる現象だとのことです。(ですが、この話をした人が"代入"と"初期化"の違いを認識していない可能性もあります。)
しかし、コンパイラによる最適化で予期せぬ動作をすることはあるので、私が聞いた内容に関係している可能性は高そうです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) Excel のユーザー定義関数でソルバーが動作しない 1 2022/09/05 19:51
- C言語・C++・C# C言語初心者 構造体 課題について 1 2023/03/10 19:30
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
- C言語・C++・C# C++のcinの動作 5 2023/02/26 00:13
- C言語・C++・C# C言語初心者です、、、お助けください 2 2023/03/14 20:08
- JavaScript カラーミーショップのsectionループ内で、[引数][戻り値]ありの関数的な処理を行いたいです。 1 2022/05/07 19:39
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 malloc関数を使ってください!お願いします! 最 1 2022/07/21 09:28
- その他(プログラミング・Web制作) このプログラミングをどう組みますか? Googlecolabでやってるんですが、出来る方お願いします 1 2022/07/13 10:52
- 数学 参考文献の探し方(数学) 1 2022/07/19 01:09
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
0除算して、落ちるプログラムと...
-
コンパイルできない
-
秀丸エディタでのC言語環境(ハ...
-
C++ で、「)」が必要 というエ...
-
IPアドレス表示プログラム
-
関数の戻り値による変数の初期化
-
__extension__
-
正しい五十音順について
-
あるプログラムのコマンドライ...
-
VBAで仕様書は書きますか?
-
バッチファイルでUSB挿入時に実行
-
VBAの再計算が反映されない件に...
-
Excelで4096点以上のFFTの方法
-
Vba UserFormを前面に出す方法...
-
【JAVA】数字をひし形に出力す...
-
EXCELなどで「返す」という表現
-
VB6のWScript.Shellについて
-
読み込み中にアクセス違反が発...
-
プラグインの作り方を教えて下さい
-
CとFORTRANの計算速度はどちら...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
0除算して、落ちるプログラムと...
-
C++でアボート(Abort)で処理が...
-
C++ で、「)」が必要 というエ...
-
io.hをincludeするとそのような...
-
コンパイラの制限 : ヒープの領...
-
不要なインクルードファイルの検出
-
どのプログラミング言語ででき...
-
Eclipseの環境設定について
-
コンパイルできない
-
初心者はIDE使わないほうが良く...
-
FORTRAN→Cに翻訳
-
fortranでのNaNについて
-
関数の戻り値による変数の初期化
-
ABAQUS ユーザーサブルーチン...
-
sprintfを用いたフォーマット文...
-
__extension__
-
変数(関数)名の頭に_
-
makeのエラーについて
-
volatile修飾について
-
C言語のワーニングメッセージの...
おすすめ情報