冗長・不適切なプログラムの例

プログラミングの授業で、“冗長” や “誤り” と判定するプログラムのサンプルを集めました。

printf やキャスト

連続した printf 呼出し

冗長な形適切な形

一行の出力は、普通は一回の printf の呼び出しで済ませましょう。

多すぎるキャスト

冗長な形適切な形

部分式のどこかが double にキャストされれば、 残りは暗黙的にキャストされます。

冗長な形適切な形

関数 sqrt の戻り値の型はもともと void なのでキャストは必要ありません。

不適切な変数名

不適切な形適切な形

説明しなくても、わかるでしょう。

if 文

同じ条件式

冗長な形適切な形

同じ(あるいは全く逆の)条件式を重複するのはよくありません。 条件を変更するときに 2 箇所を同時に変更する必要が出てきます。

一部だけ違う出力

冗長な形適切な形

出力の一部だけが変わるなら printf の書式指定を使います。

if と else で重複

冗長な形適切な形

if と else に同じ処理があるならば、外に出すべきです。

else のあとが空

冗長な形適切な形

単純に else 以降は必要ありません。

if のあとが空

冗長な形適切な形

条件式を否定して if だけにします。

不等号の連鎖

誤った形正しい形

これは冗長なのではなく、明確に間違いです。

コンマ演算子の不適切な使用

誤った形正しい形

副作用のない条件式をコンマ演算子の左オペランドに使っても意味はありません。

繰り返し

余計なブレース

冗長な形適切な形

ブレースが多すぎます。

ループの前の条件文

冗長な形適切な形

これは単純に if 文は必要ありません。 if 文がなくても no が 0 以下のとき、.... は一度も実行されません。

常に成り立つ条件式

冗長な形適切な形

この場所では 0 <= i は常に成り立ちます。

ちょっとの工夫でなくせる条件判断

冗長な形適切な形

最初から i は 3 の倍数だけを動くように書くべきです。

最初だけ特別扱い

冗長な形適切な形

最初だけ、特別扱いするなら、ループの前に出すべきです。

最後だけ特別扱い

冗長な形適切な形

最後だけ特別扱いするなら、ループのあとに出すべきです。

繰返しを制御する変数を他所で変更

不適切な形適切な形

繰返しを制御する変数は for 文の丸括弧の内部で変更するべきです。 さもないと繰返しがわかりにくくなります。

必要のない二重ループ

冗長な形適切な形

繰返し本体の最後に continue 文

冗長な形適切な形

ループの最後の continue はなくても同じです。

do 文に固執

冗長な形適切な形

ループ本体を実行しない可能性があるならば、 do 文ではなくて while 文または for 文を使うべきです。

未定義

誤った形適切な形

これは冗長なのではなく、明確に間違いです。 v = v++ の動作は、同じ変数の値の変更の順序が不明確で未定義 (undefined) です。