回答編集履歴
1
説明の追加
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 と変化し、結果を表示します。
|