• ベストアンサー

何故答えが 20 になるのでしょうか?

忙しい中失礼します。 下記のプログラムを実行した場合、出力は 20 となります。 どういう過程を追って、答えが 20 になるのでしょうか? どうかその過程を教えて下さい。お願いします。 ※ちなみに *nPtr=&nums[2];だと 出力12、 *nPtr=&nums[4];だと 出力15、 です。なぜ? ↓下記のプログラム #include <stdio.h> #include <stdlib.h> int main() { int nums[5]={1,2,3,4,5}, total=0,n=4, *nPtr=&nums[3]; while(n>=0){ total += *nPtr--; n--; } printf("%d", total); system("PAUSE"); return 0; } 上記のプログラムを実行した場合、total += *nPtr--でtotal += 4(nums[3]=4)→4 +=3で7→7 +=2で9→9 +=1で10 で答えが 10 だと思うのですが、違うのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • don_go
  • ベストアンサー率31% (336/1059)
回答No.4

>アレ? 何故今度は出力が 10 なのだろう? ループの回数が1回多い為に定義外の領域(num[-1])の値を 足してしまっているのです。 質問の時には、total の領域と num[-1] の位置が偶然一致 していた為結果が 20 となりましたが、ANo.3 では total と n の順番を変えたので今度は n の領域が一致して n(=0) の値を足したので偶然に正解と一致しただけです。 C言語では定義した変数や配列の範囲の外も参照できます。 範囲外を参照した場合には動作が不定になり、問題解決が 困難になる事も多いので注意が必要です。

jpncndgoo2
質問者

お礼

・・・ハイ。深夜遅くの回答ありがとうございました。 すごく親身に・・・。 本当にありがとうございました。

その他の回答 (3)

  • don_go
  • ベストアンサー率31% (336/1059)
回答No.3

おまけ int nums[5]={1,2,3,4,5}, total=0,n=4, *nPtr=&nums[3];   ↓ int num[] = { 1,2,3,4,5 }, n=4, total=0, *nPtr=&num[3]; と変えた場合も試して見て下さい。

jpncndgoo2
質問者

補足

アレ? 何故今度は出力が 10 なのだろう? しばらく考えてみます。 アドバイスありがとうございます。

  • don_go
  • ベストアンサー率31% (336/1059)
回答No.2

while(n>=0){   printf("Mae n=%d, total=%d, nPtr=%d num[-1]=%d\n", n, total, *nPtr, num[-1]);   total += *nPtr--;   n--;   printf("Ato n=%d, total=%d, nPtr=%d num[-1]=%d\n", n, total, *nPtr, num[-1]); } 上記の様に行を追加して実行して見て下さい。

jpncndgoo2
質問者

お礼

don_goさん深夜にも関わらず丁寧にプログラムまで書いて頂き、そして動作確認したうえでの書き込みありがとうございます。 何故出力が 20 なのか分かりました。私の回答ではループが4回まで出止まっているからですね。 親切にありがとうございました。 感謝してます。

  • shred
  • ベストアンサー率35% (25/70)
回答No.1

ループが5回まわっていますよ。

jpncndgoo2
質問者

お礼

そうですね。ループは 5回 回っていますね。確かにそうです。 ありがとうございます。

関連するQ&A