回答編集履歴

2

コード修正

2022/02/19 16:00

投稿

luuguas
luuguas

スコア492

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)で初期化されていない要素の値を得ようとしているので、バグが発生します。 (b)で`i`が合成数だった場合も0などを代入し、全ての要素が初期化されるようにしてください。
19
+ (a)の時点では初期化をしていないので、配列の各要素の値は不定です。 (b)で`i`が素数の場合は1を代入していますが、合成数の場合は代入されず、(c)で初期化されていない要素の値を得ようとしているので、バグが発生します。
17
20
 
21
+ (a)を`int prime[210] = {};`に書き換えるか、(b)で`i`が合成数だった場合は0を代入する等で、全ての要素が初期化されるようにしてください。
22
+
18
- また、C++を使うのであれば、生配列よりも`vector`を使しょう。配列を定義するときに要素の初期化を行えるため、未初期化によるバグの発生防げます。
23
+ また、C++を使うのであれば、`vector`を使うことをおすすめし。配列を定義するときに任意の値で要素の初期化を行うことができ、未初期化によるバグの発生防げます。
19
24
 
20
25
  #### コード例:
21
26
  ```C++

1

2022/02/19 15:50

投稿

luuguas
luuguas

スコア492

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;