なんとなくやりたいことはわかるけど、これでは思ったように動かないプログラム例を紹介します。
変数xの値が0から1の間のとき、OKと表示したい。
if ( 0<x<1 ) printf("OK\n"); /** NG **/ if ( 0<x && <1 ) printf("OK\n"); /** OK **/
無限ループは原則使用禁止にしています。これは適切に条件文を書けば無限ループにしなくて良いからです。
for(;;) { /*** 無限ループ ***/ ... } while(1) { /*** 無限ループ ***/ ... }
同様に breakやcontinue文の使用も最小限にしましょう。これらは必要な時がありますが、 ループの条件文をうまく書けば少なくできる場合が多いです。
0.1を10個加えれば数学的には1.0になります。しかし、コンピュータ的には 1.0になる保証はありません。つまり、0.1*10 != 1.0 です。 これは0.1がコンピュータ上では無理数となってしまうからです。
以下のプログラムを実行すると、最後は 0.999999 となるはずです。
int main(void) { float x; for ( x=0.0 ; x<=1.0 ; x+=0.01 ) printf("%f\n", x); }
プログラムを実行すると確かに答はでるのだが…ちょっと書き直した方が良いと思われるプログラム例を紹介します。 レポートでこのようなプログラムを出すと再提出になります。
変数xの値が3以下のとき「小」と表示し、3から7の間のとき「中」と表示し、 7以上のとき「大」と表示したい。
/** NG **/ if ( x<=3 ) printf("小\n"); else if ( 3<x && x<7 ) printf("中\n"); else if ( 7<=x ) printf("大\n"); /** OK **/ if ( x<=3 ) printf("小\n"); else if ( x<7 ) printf("中\n"); else printf("大\n");
1番目の条件文で、x<=3 を評価しているので、その後のelse以下では x<=3 になることはありません。従って、2番目の条件文で 3<x を 評価するのは無駄です。
同様の理由で、最後の条件文は不要になりますので、elseのみで良い です。
/** NG **/ #include <stdio.h> int main( void ) { float sum=0.0; do { sum += 0.01; printf("sum=%f\n", sum); } while( sum != 1.0 ); return 0; }先ほど書いたように、0.01は二進法では有理数ではありません。 従って、100回足しても丁度1になる保証はありません。