回答編集履歴
2
コード修正
test
CHANGED
@@ -1,4 +1,7 @@
|
|
1
|
+
配列をグローバルで宣言した時の仕様は、以下の質問を参考にしてください。
|
2
|
+
[https://teratail.com/questions/168427](https://teratail.com/questions/168427)
|
3
|
+
|
1
|
-
|
4
|
+
バグの理由は、**配列の初期化をしていない**からです。
|
2
5
|
```C++
|
3
6
|
//5行目~
|
4
7
|
void _main() {
|
@@ -13,9 +16,11 @@
|
|
13
16
|
for(int i=0;i<210;i++){if(prime[i]==1)cout<<i<<' ';} //(c)
|
14
17
|
}
|
15
18
|
```
|
16
|
-
(a)の時点では初期化をしていないので、配列の各要素の値は不定です。 (b)で`i`が素数の場合は1を代入していますが、合成数の場合は代入されず、(c)で初期化されていない要素の値を得ようとしているので、バグが発生します。
|
19
|
+
(a)の時点では初期化をしていないので、配列の各要素の値は不定です。 (b)で`i`が素数の場合は1を代入していますが、合成数の場合は代入されず、(c)で初期化されていない要素の値を得ようとしているので、バグが発生します。
|
17
20
|
|
21
|
+
(a)を`int prime[210] = {};`に書き換えるか、(b)で`i`が合成数だった場合は0を代入する等で、全ての要素が初期化されるようにしてください。
|
22
|
+
|
18
|
-
また、C++を使うのであれば、
|
23
|
+
また、C++を使うのであれば、`vector`を使うことをおすすめします。配列を定義するときに任意の値で要素の初期化を行うことができ、未初期化によるバグの発生も防げます。
|
19
24
|
|
20
25
|
#### コード例:
|
21
26
|
```C++
|
1
test
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
グローバル化すると結果が変わる理由は分かりませんが、バグの理由は明らかに**配列の初期化をしていない**からです。
|
2
2
|
```C++
|
3
|
+
//5行目~
|
4
|
+
void _main() {
|
3
5
|
int prime[210]; //(a)
|
4
6
|
for(int i=2;i<=210;i++){
|
5
7
|
bool p=true;
|