回答編集履歴

1

説明の追加

2021/07/11 11:04

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -17,3 +17,35 @@
17
17
  + while (++i < j) printf("%dはv[%d]と一致しました。\n", x, i);
18
18
 
19
19
  ```
20
+
21
+ **追記**
22
+
23
+ `while (--i >= 0 & v[i] == x) ;` の & は && の間違いです。
24
+
25
+ & だと、第1項の --i >= 0 と第2項の v[i] == x の両方を評価し、
26
+
27
+ その結果のビットAND演算を実行します。
28
+
29
+ i が -1 になった時 --i >= 0 の判定はできますが、
30
+
31
+ v[i] == x で v[-1] を参照するので未定義動作になります。
32
+
33
+ && だと、第1項の --i >= 0 の評価結果が 0 だと
34
+
35
+ 第2項の v[i] == x は評価しないから問題ありません。
36
+
37
+
38
+
39
+ コードの意味ですが、例えば、
40
+
41
+ v[] = { 1, 2, 3, 3, 3, 4, ... }、x = 3 のとき
42
+
43
+ v[2], v[3], v[4] が求めるものです。
44
+
45
+ midid が 3 だったとすると、
46
+
47
+ 最初の whileループを終了した時、i は 1 になります。
48
+
49
+ 次の whileループを終了した時、j は 5 になります。
50
+
51
+ 最後の whileループで、i が 2、3、4 と変化し、結果を表示します。