ループでたし込む時,和を作る変数の初期化

1.forループを使い,ある変数に「たしこむ」時,その変数に0を入れておく必要がある。次のプログラムは,作業前にsum,sum2に0を代入して,準備をしてから作業を行ない,成功した例である。

List 1 成功したテストプログラム

/*1から10までの単純和と1から10までの平方和*/
#include <stdio.h>

int main()
{
    int i;
    int
sum;  /*単純和をしまう変数*/
    int sum2; /*平方和をしまう変数*/
    printf("初期化前のsum,sum2=%d %d\n",sum,sum2);
    sum=0;    /*0を代入 これをしておかないと変な値が入っていることになる*/
    sum2=0;   /*0を代入 これをしておかないと変な値が入っていることになる*/

    printf("初期化後のsum,sum2=%d %d\n",sum,sum2);
    for (i=1;i<=10;i++) {
        sum=sum+i;
        sum2=sum2+i*i;
        printf("i,sum,sum2=%d %d %d\n",i,sum,sum2);
    }
    printf("1から10までの単純和と平方和=%d %d\n",sum,sum2);
    return 0;
}

実行結果
初期化前のsum,sum2=0 4201393
初期化後のsum,sum2=0 0
i,sum,sum2=1 1 1
i,sum,sum2=2 3 5
i,sum,sum2=3 6 14
i,sum,sum2=4 10 30
i,sum,sum2=5 15 55
i,sum,sum2=6 21 91
i,sum,sum2=7 28 140
i,sum,sum2=8 36 204
i,sum,sum2=9 45 285
i,sum,sum2=10 55 385
1から10までの単純和と平方和=55 385

2.次のプログラムは,作業前にsum,sum2に0を代入せずに,作業を行ない,失敗した例である。
sumは正しく動作しているが,これは偶然である。sum2は最初から4201520が格納されており,sum2の集計に失敗している。
値を代入する前の変数に0が入っていることを期待して作成されたプログラムは動作が保証されない。

List 2 失敗したテストプログラム

/*1から10までの単純和と1から10までの平方和*/
#include <stdio.h>

int main()
{
    int i;
    int sum;  /*単純和をしまう変数*/
    int sum2; /*平方和をしまう変数*/
    printf("作業前のsum,sum2=%d %d\n",sum,sum2);
    for (i=1;i<=10;i++) {
        sum=sum+i;
        sum2=sum2+i*i;
        printf("i,sum,sum2=%d %d %d\n",i,sum,sum2);
    }
    printf("1から10までの単純和と平方和=%d %d\n",sum,sum2);
    return 0;
}

実行結果
作業前のsum,sum2=0 4201520
i,sum,sum2=1 1 4201521
i,sum,sum2=2 3 4201525
i,sum,sum2=3 6 4201534
i,sum,sum2=4 10 4201550
i,sum,sum2=5 15 4201575
i,sum,sum2=6 21 4201611
i,sum,sum2=7 28 4201660
i,sum,sum2=8 36 4201724
i,sum,sum2=9 45 4201805
i,sum,sum2=10 55 4201905
1から10までの単純和と平方和=55 4201905