Upgrade to Pro — share decks privately, control downloads, hide ads and more …

C言語よくある誤り

 C言語よくある誤り

More Decks by 自然言語処理研究室

Other Decks in Programming

Transcript

  1. 誤りには4段階ある • レベル1: コンパイルエラー – コンパイルできないのですぐに気付く • レベル2: 実行時エラー – 実行中にエラーが出てプログラムが停止 •

    レベル3: エラー表示されない – 正しくない出力が出るだけなので気付きにくい • レベル4: アルゴリズムの誤り – 最も気付きにくい
  2. 解1-2: 見間違い int o, p, q; 0(ゼロ)と O(オー)、1(いち) と l(エル)などを間違う。

    表示しているフォントに よってはほとんど見分け がつかない場合もある。 なお、O(オー)やl(エル)と いう変数が宣言されて いるとコンパイルエラー は出ないので、難易度が レベル2にアップする。
  3. 解1-4: 記号間違い for (i=1; i<10; i++) printf ("%d", I); コンマ","

    コロン":" セミコ ロン";"の使い方を間違え る。左の例では、 • for文の , →; • printf の最後 :→; の2つ(3ヶ所)が間違い。
  4. 解1-5: 全角スペース i = i + 1; コメントやprintf ("...")以外 に全角スペース(「 」)が

    (うっかり)入力されてい る。これは(当然ながら)見 た目では全く分からない のでエラーメッセージで 判断するしかない。 前のスライドでも文中に 全角スペースが入ってい る。
  5. 解1-6: 変数の未宣言 void main(void){ int i, p=0; for (i=0; i<10;

    i++) printf ("%d", p); } 使っている変数を宣言し ていない。 左の例では i を宣言して いない。
  6. 解2-1: ゼロで割り算している。 int s = 0; int t = 3

    / s; 自分が予期しない理由で ある変数が0になってし まい、その変数で除算を してしまう時がある。 この本当の原因は割り算 している部分ではなく、他 の場所で変数が正しく代 入されないことなので、 割り算部分に問題はな い。
  7. 解2-2: 配列の範囲外使用 int i, a[10]; for (i=0; i<=10; i++){ scanf

    ("%d", &a[i]); } int a[10] の 宣 言 は a[0] ~ a[9]を確保するのでa[10] は存在しない。 このエラーは一応レベル 2に入れたが、実行時に エラーが出ないこともあ る(つまりレベル3の場合 がある)ので注意。
  8. 解3-1: 数値型の誤り int a=3, b=5; printf ("%f\n", (double) a /

    b); 特に割り算において、小数点 以下も必要なのに整数型を 整数型で割ってしまう。 左の例の場合、%fのように実 数で表示させようとしても、 表示させる以前の a / b を計 算した瞬間に 0 になる(割る 数と割られる数の両方が整 数だと答えは必ず整数で計 算しようとする)。
  9. 解3-2: 実数による条件分岐 実数には若干の誤差が 出るので、条件判断(if, for, while) に実数を使う時は 注意しないといけない。 左の例では、r がぴったり

    1 にならない可能性が高 いので、正しく動作しない 可能性が高い。 double r = 0.0; while (r != 1.0) { ... r += 0.1; }
  10. 問3-6 // aが 0 以外なら"表示2"を表示させたい if (a == 0) if

    (b == 0) printf ("表示1"); else printf ("表示2"); }
  11. 解3-6: if と else の対応 前スライドのプログラムは問題な さそうだが、「表示2」が表示され るのはaが0でbが0以外の時( ) ※

    で あり、決してaが0以外の時ではな い。つまり else は一番近い if に対 する else である。また、字下げ(イ ンデント)にだまされてもいけな い。(コンパイラにとって字下げは 関係ない) ※のようにしたいのであれば左の ようにすればよい。誤解を減らす ために if文には常に {...} をつける ことを推奨する。 // aが 0 以外なら"表示2"を表示させたい if (a == 0) { if (b == 0) { printf ("表示1"); } } else { printf ("表示2"); }