みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

for文

#include <stdio.h>

int main(void)
{
int i;
int sum=0;
int num, tmp;
printf("整数は何個かな:");
scanf("%d",&num);

for(i=0; i<num; i++){
printf("No.%d:",i+1);
scanf("%d",&tmp);
sum+=tmp;
}

printf("合計値は:%d\n",sum);
printf("平均値は:%.2f\n", (double)sum/num);

return(0);
}

上の文のforの箇所を

for(i=1; i<=num; i++){
printf("No.%d:",i);
scanf("%d",&tmp);
sum+=tmp;
  }
としても結果的に同じですよね?
どっちでもいいかどうか迷ってます。教えて下さい。

投稿日時 - 2005-08-17 00:10:15

QNo.1584712

すぐに回答ほしいです

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

構文的にはどちらでもよいです。
時と場合によって使い分けるのがよいと思います。

特別に理由が無い場合は、私は0から始まる方に固定するようにしています。(特殊な場合を除く)

0スタートと1スタートが混在した長いプログラムを書くと、デバックの時に「ここは1から始まって…ここは0からで…」という具合で苦労するからです。
サンプルのソースくらいなら大丈夫ですが、アプリケーションになるくらいのソースだと、forループはかなりの数が出てきます。forの中にforが入ることも多々出てきます。

プログラムは、メモリの操作、配列など、0からスタートした方がよいものが多いので、なるべく0からはじめるようにしています。

ご参考までに。

投稿日時 - 2005-08-17 00:25:00

お礼

アドバイスありがとうございます。時と場合に判断して、できるだけ私も統一して使っていきたいと思いました。

投稿日時 - 2005-08-17 00:33:34

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.4

結果的にはどちらも同じです。
ですが、プログラムはできる限り明示的にまたシンプルに書くことをお勧めします。
つまり今回の場合ですと、ループの回数は num までなので、for文のループ条件は i < num または i <= num のどちらでも構わないと思います。
ただループ中で使用するのが printf の行のみなので、ここでわざわざ i + 1 にしたりするのはわかりづらいと考えます。
そうすると for文は、
 for( i = 1; i <= num; i++ )
の方がより明示的かな、と思います。
これがループ中で配列を使ったりすると、i が 1 から始まると配列を使う箇所で i - 1 をしないといけなくなったりして都合が悪いので 0 から始めたりしますね。

投稿日時 - 2005-08-17 00:32:34

お礼

判断して明示的に表せる方を使っていきたいです。ありがとうございました。

投稿日時 - 2005-08-17 00:40:33

ANo.3

動作としてはどっちでもいいです。
しかし,これは数値処理の作法というか思想にかかわる話です。
最初の例は0 base、二つ目の例は1 baseと呼ばれる「数え方」で,たとえば10回という数を
「0から始まって9まで1ごとに数えた数」
と考えるか,
「1から始まって10まで1ごとに数えた数」
と考えるかの違いです。

一般にソフトウェアの世界では,低級な処理(よりハードウェアに近い処理)では0baseが使われます。これは,256種類の数を表現するために0baseでは8bit(8本の電線)があれば表現できるのに対して1baseをハードウェアで表現するためには1本余分に必要であるというところから来ています。

C言語は一般に高級言語(ハードウェアに依存しない言語)と呼ばれていますから,パソコンで使われているようなコンパイラではどちらをとっても差異はありません。もしかしたらコンパイラはまったく同じコードを出力するかもしれません。
しかし,将来組み込みマイコンやマイクロコードなどのハードウェアと密接に連携するソフトウェアを設計する可能性があるなら,自分の「思想」として,「どちらでもいい場合には0baseを採る」と決めてしまうと後で楽です。もちろん,1baseを「思想」とするのもいいでしょう。

よく言われることですが,ソフトウェアのコーディングでは「昨日の自分は最も理解しがたい他人」ですから。

投稿日時 - 2005-08-17 00:28:49

お礼

専門的におしえていただきありがとうございます。

投稿日時 - 2005-08-17 00:39:31

ANo.1

プログラマ本人がわかっていればどっちでもいいと思いますが、
i がNoとして使われていて、Noは1から始まるということですから
そういう意味で言えば
for(i=1; i<=num; i++){
の方が素直であり、意味と数値が一致するので良いと思います。

投稿日時 - 2005-08-17 00:14:36

お礼

ありがとうございます。

投稿日時 - 2005-08-17 00:30:26