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を探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
0除算して、落ちるプログラムと...
-
コンパイルできない
-
C++でアボート(Abort)で処理が...
-
io.hをincludeするとそのような...
-
fortranでのNaNについて
-
PICマイコンによる乱数の表示に...
-
C++ で、「)」が必要 というエ...
-
コンパイラについて
-
C言語
-
__extension__
-
Eclipseの環境設定について
-
不要なインクルードファイルの検出
-
VBAで仕様書は書きますか?
-
あるプログラムのコマンドライ...
-
正しい五十音順について
-
65536は2の何乗なのでしょうか?
-
VBAの再計算が反映されない件に...
-
期間重複チェックがわかりません
-
変数の値が勝手に変化する原因
-
EXCELなどで「返す」という表現
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
0除算して、落ちるプログラムと...
-
C++ で、「)」が必要 というエ...
-
コンパイルできない
-
C++でアボート(Abort)で処理が...
-
io.hをincludeするとそのような...
-
コンパイラについて
-
Eclipseの環境設定について
-
どのプログラミング言語ででき...
-
C言語のワーニングメッセージの...
-
PICマイコンによる乱数の表示に...
-
変数(関数)名の頭に_
-
ccコマンドの使い方
-
fortranでのNaNについて
-
__extension__
-
Visual C++とVisual C++.NETの違い
-
C言語
-
初心者はIDE使わないほうが良く...
-
関数の戻り値による変数の初期化
-
ABAQUS ユーザーサブルーチン...
-
graph.hがincludeできない
おすすめ情報