More Related Content
Similar to C言語よくある誤り (15)
More from 長岡技術科学大学 自然言語処理研究室
More from 長岡技術科学大学 自然言語処理研究室 (20)
C言語よくある誤り
- 2. このスライドは...
●
C言語プログラミング初心者を対象に作成して
います。
●
C言語でよく見かける誤り(計14種類)をレベル
別に例示し、解説しています。
– 解答を見る前に、何が誤りかを自分で考えてみて
ください。
●
このスライドに書かれている誤りを一通り覚える
ことでかなりの初歩的なミスを回避できると思
います。
- 3. 誤りには4段階ある
●
レベル1: コンパイルエラー
– コンパイルできないのですぐに気付く
●
レベル2: 実行時エラー
– 実行中にエラーが出てプログラムが停止
●
レベル3: エラー表示されない
– 正しくない出力が出るだけなので気付きにくい
●
レベル4: アルゴリズムの誤り
– 最も気付きにくい
- 5. 問1-1
if (a < b) brake;
どこかに間違いがあるので
(以下同様)、次のスライドを
見る前に、何が誤りなのかを
考えてみてください。
- 8. 解1-2: 見間違い
int o, p, q; 0(ゼロ)と O(オー)、1(いち)
と l(エル)などを間違う。
表示しているフォントに
よってはほとんど見分け
がつかない場合もある。
なお、O(オー)やl(エル)と
いう変数が宣言されて
いるとコンパイルエラー
は出ないので、難易度が
レベル2にアップする。
- 12. 解1-4: 記号間違い
for (i=1; i<10; i++) コンマ"," コロン":" セミコ
ロン";"の使い方を間違え
printf ("%d", I); る。左の例では、
● for文の , →;
● printf の最後 :→;
の2つ(3ヶ所)が間違い。
- 14. 解1-5: 全角スペース
i = i + 1; コメントやprintf ("...")以外
に全角スペース(「 」)が
(うっかり)入力されてい
る。これは(当然ながら)見
た目では全く分からない
のでエラーメッセージで
判断するしかない。
前のスライドでも文中に
全角スペースが入ってい
る。
- 19. 解2-1: ゼロで割り算している。
int s = 0; 自分が予期しない理由で
ある変数が0になってし
int t = 3 / s; まい、その変数で除算を
してしまう時がある。
この本当の原因は割り算
している部分ではなく、他
の場所で変数が正しく代
入されないことなので、
割り算部分に問題はな
い。
- 21. 解2-2: 配列の範囲外使用
int i, a[10]; int a[10] の 宣 言 は a[0] ~
a[9]を確保するのでa[10]
for (i=0; i<=10; i++){ は存在しない。
scanf ("%d", &a[i]); このエラーは一応レベル
2に入れたが、実行時に
} エラーが出ないこともあ
る(つまりレベル3の場合
がある)ので注意。
- 24. 解3-1: 数値型の誤り
int a=3, b=5; 特に割り算において、小数点
以下も必要なのに整数型を
整数型で割ってしまう。
printf ("%fn", 左の例の場合、%fのように実
(double) a / b); 数で表示させようとしても、
表示させる以前の a / b を計
算した瞬間に 0 になる(割る
数と割られる数の両方が整
数だと答えは必ず整数で計
算しようとする)。
- 26. 解3-2: 実数による条件分岐
double r = 0.0; 実数には若干の誤差が
出るので、条件判断(if, for,
while (r != 1.0) { while) に実数を使う時は
注意しないといけない。
... 左の例では、r がぴったり
1 にならない可能性が高
r += 0.1; いので、正しく動作しない
} 可能性が高い。
- 28. 解3-3: 初期化を忘れる
int a = 0; 変数を宣言すると初期
値は0だと思い込んでい
a = a + 3; ろんな処理をしてしまう。
とても大きくおかしな値
が出 力さ れる 時は だ い
たいこれが原因である。
コンパイル時にエラーが
出ない。
- 30. 解3-4: "=" と "==" を間違える
if (a == b) break; 初心者にとてもよくある
誤り。左の例の場合、コン
パイルでエラーは出ない
ことに注意。
- 32. 解3-5: ';'のつけすぎ
for (i = 1; i < 10; i++) エラーも出ないので初心
者にはかなり気付きにく
printf ("表示n"); い。
C言語の「文末」には ; が
必要と覚えていると、左
の例のように for 文にま
でつけてしまう。
- 33. 問3-6
// aが 0 以外なら"表示2"を表示させたい
if (a == 0)
if (b == 0)
printf ("表示1");
else
printf ("表示2");
}
- 34. 解3-6: if と else の対応
// aが 0 以外なら"表示2"を表示させたい 前スライドのプログラムは問題な
さそうだが、「表示2」が表示され
if (a == 0) { るのはaが0でbが0以外の時(※)で
あり、決してaが0以外の時ではな
if (b == 0) { い。つまり else は一番近い if に対
する else である。また、字下げ(イ
printf ("表示1"); ンデント)にだまされてもいけな
} い。(コンパイラにとって字下げは
関係ない)
} else { ※のようにしたいのであれば左の
ようにすればよい。誤解を減らす
printf ("表示2"); ために if文には常に {...} をつける
ことを推奨する。
}
- 36. アルゴリズムの誤り
●
そもそもプログラム以前にアルゴリズムが間
違っている場合。
– 例えば、4行4列の行列式にサラスの方法を用い
る、など。
●
自分では正しいと思っているからそのアルゴリズ
ムを使用しているため、間違いに最も気付きにく
い。
– 検証可能な出力をする、などの方法で確認するし
かなく、場合によっては検証できない問題もあ
る。
- 38. 間違いを減らすために
●
エラーが出ている場合は、エラーメッセージをよ
く読む
– 英語の場合は読むのが大変だが、それでも読ん
だほうが近道だ
●
エラーが出ない誤りの場合は、このスライドで紹
介したような誤りをよく記憶しておく
– 出力結果が何かおかしいと感じた時に、「気付き
にくいエラー」をしていないかよく考える