C言語祭り?

最近2人の友達からよくC言語について聞かれる。一人はまったくCを知らない人で授業で出てくる課題(九九を表示しろとか)に四苦八苦している人。もう一人はある程度Cを知っていてバイトでプログラミングを手伝っているけど、ポインタとか自作関数の扱いがよく分かってない人。(それを知らないでプログラミングのバイトができるのかというのは不問で)


まったくの初心者に教えるときは自分も苦労したなぁと思い出せてよいことです。今日はforループに手こずってましたが、よくよく考えるとforループって結構複雑ですよね。

int i;
for(i=0;i<10;i++)
{
  ...
}

for(初期化;条件式;更新)
一番左端の初期化は最初の一回だけ呼び出されるけど、条件式はループの先頭、更新はループの最後。それぞれがどこで行われるのかだけで混乱してしまいます。10回なにかを繰り返したいだけなのに、ループ変数のiが必要なのもわかりにくいかもしれないですね。


条件式だけ書いておけばいいwhileループの方が初心者には優しいのかも〜。


もう一人の悩み。
ループ中でランダムに整数の正と負を変えたいということで作ったのが下の文

int sign;
for(i=0;i<10;i++)
{
  sign = pow(-1,rand()%2);
}

この書き方はまさに数学的だな〜(違う?)と感心したんですが、あんまり数学関数を使いたくない僕としては下みたいな方法を提案してみました。速度は下の方が有利で、わかりやすさは同程度かと思います。

int sign;
int plusminus[] = {-1,1};
for(i=0;i<10;i++)
{
  sign = plusminus[rand()%2];
}

100万回ループで244ミリ秒と17ミリ秒ですね。普段ならこの程度は気にしなくていいなじゃないの?とも思いますが、そのプログラムは実際に100万回以上のループが発生していたりするのでまったく無意味なわけでもないですね。


相手からは感心されたんですが、普段プログラムを書いている人とそうでない人の考え方の違いを垣間見ることができたかもしれないです。・・・とか偉そうなこと言ってますがもっとわかりやすくて、速い方法があったら教えてください。


追記
powはdoubleを返すからそういう意味でもあんまりよくないかも〜。