for文を使った反復処理についての補足
このページでは、1から10までの総和を例に、for文の動作と記法について補足する。
繰り返し計算の際の変数の「動き」
for文を使って1から10までの合計を求める例題プログラムについて、内部の変数の動きをシミュレーションしてみよう。
#include <stdio.h> main( ) { int n, sum ; sum=0 ; for (n=1 ; n<=10 ; n=n+1) { sum = sum + n ; } printf("1から10までの合計: %d\n",sum) ; } |
プログラムの各ステップで、変数の値がどのように変化するかを、時系列的に表にしてみた(長くなるので、途中は省略)。 太文字は「ただいま処理中」の箇所を示している。 慣れないうちは、このようにプログラムの動作を、特に、変数(メモリー)の値の変化に注目しながら、頭の中で(あるいは紙の上で)追いかけてみると良いだろう。
実行・評価される箇所 | 動作 | nの値 | sumの値 | 繰り返し回数 |
int n,sum ; | 変数(メモリー)の確保 | 領域確保 | 領域確保 | |
sum = 0 ; | sumの値を0にセット | 0 | ||
for (n=1 ; n<=10 ; n=n+1) { | nを1にセット この部分は「最初の1回」 だけ実行される |
1 | 0 | |
for (n=1 ; n<=10 ; n=n+1) { | n<=10かどうかチェック nは1なので条件を満足。 反復箇所を実行。 |
1 | 0 | 1回目 |
sum = sum + n ; | 0 + 1 を sumにセット | 1 | 0→1 | |
for (n=1 ; n<=10 ; n=n+1) { | nの値を1増やす。 | 1→2 | 1 | |
for (n=1 ; n<=10 ; n=n+1) { | n<=10かどうかチェック nは2なので条件を満足。 反復箇所を実行。 |
2 | 1 | 2回目 |
sum = sum + n ; | 1 + 2 を sumにセット | 2 | 1→3 | |
for (n=1 ; n<=10 ; n=n+1) { | nの値を1増やす。 | 2→3 | 3 | |
for (n=1 ; n<=10 ; n=n+1) { | n<=10かどうかチェック nは3なので条件を満足。 反復箇所を実行。 |
3 | 3 | 3回目 |
sum = sum + n ; | 3 + 3 を sumにセット | 3 | 3→6 | |
for (n=1 ; n<=10 ; n=n+1) { | nの値を1増やす。 | 3→4 | 6 | |
for (n=1 ; n<=10 ; n=n+1) { | n<=10かどうかチェック nは4なので条件を満足。 反復箇所を実行。 |
4 | 6 | 4回目 |
sum = sum + n ; | 6 + 4を sum にセット | 4 | 6→10 | |
途 中 省 略 |
||||
sum = sum + n ; | 45 + 10をsumにセット | 10 | 45→55 | 11回目 |
for (n=1 ; n<=10 ; n=n+1) { | nの値を1増やす。 | 10→11 | 55 | |
for (n=1 ; n<=10 ; n=n+1) { | n<=10かどうかチェック nは11なので条件を満足しない。 反復を中止。 |
11 | 55 | |
printf("1から10までの合計: %d\n",sum) ; | 答えを表示 | 11 | 55 |
for文を使って1から10までの総和の計算するプログラム(別バージョン)
for文の動作をより理解するため、総和の別バージョンをいくつか紹介しておこう:
#include <stdio.h> main() { int sum,n; sum=0; n=1 ; for ( ; n<=10 ; ) { sum=sum+n ; n=n+1 ; } printf("1から10までの総和= %d\n",sum) ; }
反復を開始する前の処理をfor文の前に出し、反復の都度実行する文を、反復内容の中に記述した例。 このように、for文の項目は空欄でも構わないが、区切りのセミコロン ; は必ず必要。
#include <stdio.h> main() { int sum,n; sum=0; for (n=1 ; n<=10 ; sum=sum+(n-1)) { n=n+1 ; } printf("1から10までの総和= %d\n",sum) ; }
総和を足し上げる文と、nを1ずつ増やす文の場所を入れ替えた例。sumに加える「前」に、nはすでに1だけ増えているので、
sum=sum+(n-1)
となる。
#include <stdio.h> main() { int sum,n; for (sum=0,n=1 ; n<=10 ; sum=sum+n,n=n+1) { } printf("1から10までの総和= %d\n",sum) ; }
ここで使われている,
はコンマ演算子と呼ばれ、
変数宣言の際に使われるコンマと同様の働きをする。
sumの初期化と更新を、for文の三点セットの中に入れた例。 このように、文をコンマ(,)で区切って、各項目に複数の文を並べることも許されている。 このときも、for( )の中にはセミコロンは二つでなければならない。