teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

追記

2022/08/21 23:04

投稿

thkana
thkana

スコア7738

answer CHANGED
@@ -7,4 +7,27 @@
7
7
  そして、常にJ=1になってしまうということは、`j<5`は常に真で延々と表示が続いて止まらないという現象が起こるはず、また質問の主題のsの値が大きくなってしまうという現象も、質問のソースでは発生する要素がありません。
8
8
 
9
9
  まずなによりも、質問に書かれた「結果」は本当にそこに書かれたソースをコンパイルしたものの実行結果かどうか、というのを確認していただけますでしょうか。
10
- そこが違っていると質問そのものが成り立たなくなるので。
10
+ そこが違っていると質問そのものが成り立たなくなるので。
11
+
12
+ ---
13
+ AtCoderのテスト環境で症状の再現を確認しました。でも、コンパイラをclangにすると症状が出ないですね。
14
+ 手元のgcc 9.4.0(WSL/Ubuntu)で試すと、最適化オプション-O0では症状出ず、-O2で出る、ということで「仕組み」は最適化の闇の中ということになってしまいそうです。アセンブリレベルで解析するならもう一歩進めますが、所詮「未定義動作」なので突き詰めてもしかたないかなぁ。競技プログラミングな人には興味の対象外でしょうね。
15
+ 一応、この辺が症状の出る最小コードかと思います。
16
+ ```C++
17
+ #include <iostream>
18
+ using namespace std;
19
+
20
+ int main() {
21
+ int X[4][13] = {0};
22
+ for (int j = 0; j < 1; ++j) { //j < 1は影響しないが++jは影響あり
23
+ for (int s = 12; s < 14; ++s) { //s=13では症状出ない
24
+ cout << j << "," << s << endl;
25
+ if (X[j][s] == 0)
26
+ ;
27
+ }
28
+ // break; //これを生かすと症状出ない
29
+ }
30
+ }
31
+ ```
32
+ 内側for文の外側の状況が影響するので、かなりソースから変形された処理が行われているのでしょう。
33
+ 私はここでギブアップ。