Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
C言語よくある誤り
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
自然言語処理研究室
April 11, 2013
Programming
370
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
C言語よくある誤り
自然言語処理研究室
April 11, 2013
More Decks by 自然言語処理研究室
See All by 自然言語処理研究室
データサイエンス14_システム.pdf
jnlp
0
420
データサイエンス13_解析.pdf
jnlp
0
540
データサイエンス12_分類.pdf
jnlp
0
380
データサイエンス11_前処理.pdf
jnlp
0
500
Recurrent neural network based language model
jnlp
0
180
自然言語処理研究室 研究概要(2012年)
jnlp
0
160
自然言語処理研究室 研究概要(2013年)
jnlp
0
130
自然言語処理研究室 研究概要(2014年)
jnlp
0
150
自然言語処理研究室 研究概要(2015年)
jnlp
0
230
Other Decks in Programming
See All in Programming
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
360
地域 SRE コミュニティ最前線 - ホンマでっかSRE勉強会
tk3fftk
0
270
Generative UI & AI-Assistants for Your Angular Solutions
manfredsteyer
PRO
1
210
えっ!!コードを読まずに開発を!?
hananouchi
0
230
jsmini JavaScript Engine を作ってみた話
yosuke_furukawa
PRO
0
170
AI時代のPHPer生存戦略 ~「言語、もうなんでもよくない?」に本気で向き合う~
vivion
0
150
SREの積み重ねがAI駆動開発のガードレールになった ― 7つの実践/SRE Guardrails The 7
tomoyakitaura
8
5.3k
はてなアカウント基盤 State of the Union
cockscomb
1
1.3k
壊れたパーサから始める関数型設計と構成的なパーサ #fp_matsuri
raiga0310
2
390
なぜ型を書くのか? TSKaigi2026で改めて考える #tskaigi_smarthr
kajitack
0
400
FDEが実現するAI駆動経営の現在地
gonta
2
200
Claude Opus 4.6以後の受託開発エンジニアの変化(Claude Code開発ノウハウ大公開スペシャルbyクラスメソッド)
iidatakuma
1
840
Featured
See All Featured
Believing is Seeing
oripsolob
1
170
Why You Should Never Use an ORM
jnunemaker
PRO
61
9.9k
The Cost Of JavaScript in 2023
addyosmani
55
10k
Digital Ethics as a Driver of Design Innovation
axbom
PRO
1
350
Testing 201, or: Great Expectations
jmmastey
46
8.2k
Fashionably flexible responsive web design (full day workshop)
malarkey
408
67k
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
330
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
660
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
34
2.8k
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
0
450
XXLCSS - How to scale CSS and keep your sanity
sugarenia
249
1.3M
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
Transcript
Cプログラミング よくある誤り 山本 和英 長岡技術科学大学 電気系
このスライドは... • C言語プログラミング初心者を対象に作成して います。 • C言語でよく見かける誤り(計14種類)をレベル 別に例示し、解説しています。 – 解答を見る前に、何が誤りかを自分で考えてみて ください。
• このスライドに書かれている誤りを一通り覚える ことでかなりの初歩的なミスを回避できると思 います。
誤りには4段階ある • レベル1: コンパイルエラー – コンパイルできないのですぐに気付く • レベル2: 実行時エラー – 実行中にエラーが出てプログラムが停止 •
レベル3: エラー表示されない – 正しくない出力が出るだけなので気付きにくい • レベル4: アルゴリズムの誤り – 最も気付きにくい
レベル1: コンパイルエラー (6問)
問1-1 if (a < b) brake; どこかに間違いがあるので (以下同様)、次のスライドを 見る前に、何が誤りなのかを 考えてみてください。
解1-1: スペルミス if (a < b) break; break; や continue;
など、つ づりを間違う。
問1-2 int 0, p, q;
解1-2: 見間違い int o, p, q; 0(ゼロ)と O(オー)、1(いち) と l(エル)などを間違う。
表示しているフォントに よってはほとんど見分け がつかない場合もある。 なお、O(オー)やl(エル)と いう変数が宣言されて いるとコンパイルエラー は出ないので、難易度が レベル2にアップする。
問1-3 printf ("Hello!!")
解1-3: 記号忘れ printf ("Hello!!"); 閉じ括弧"}"やセミコロン ";"を忘れる。 左の例では文末のセミコ ロン ; を忘れている。
問1-4 for (i=1, i<10, i++) printf ("%d", i):
解1-4: 記号間違い for (i=1; i<10; i++) printf ("%d", I); コンマ","
コロン":" セミコ ロン";"の使い方を間違え る。左の例では、 • for文の , →; • printf の最後 :→; の2つ(3ヶ所)が間違い。
問1-5 i = i + 1;
解1-5: 全角スペース i = i + 1; コメントやprintf ("...")以外 に全角スペース(「 」)が
(うっかり)入力されてい る。これは(当然ながら)見 た目では全く分からない のでエラーメッセージで 判断するしかない。 前のスライドでも文中に 全角スペースが入ってい る。
問1-6 void main(void){ int p=0; for (i=0; i<10; i++) printf
("%d", p); }
解1-6: 変数の未宣言 void main(void){ int i, p=0; for (i=0; i<10;
i++) printf ("%d", p); } 使っている変数を宣言し ていない。 左の例では i を宣言して いない。
レベル2: 実行時エラー (2問)
問2-1 int s = 0; int t = 3 /
s;
解2-1: ゼロで割り算している。 int s = 0; int t = 3
/ s; 自分が予期しない理由で ある変数が0になってし まい、その変数で除算を してしまう時がある。 この本当の原因は割り算 している部分ではなく、他 の場所で変数が正しく代 入されないことなので、 割り算部分に問題はな い。
問2-2 int i, a[10]; for (i=0; i<=10; i++){ scanf ("%d",
&a[i]); }
解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の場合 がある)ので注意。
レベル3: エラー表示されない (間違った結果になる) (6問)
問3-1 int a=3, b=5; printf ("%f\n", a / b);
解3-1: 数値型の誤り int a=3, b=5; printf ("%f\n", (double) a /
b); 特に割り算において、小数点 以下も必要なのに整数型を 整数型で割ってしまう。 左の例の場合、%fのように実 数で表示させようとしても、 表示させる以前の a / b を計 算した瞬間に 0 になる(割る 数と割られる数の両方が整 数だと答えは必ず整数で計 算しようとする)。
問3-2 double r = 0.0; while (r != 1.0) {
... r += 0.1; }
解3-2: 実数による条件分岐 実数には若干の誤差が 出るので、条件判断(if, for, while) に実数を使う時は 注意しないといけない。 左の例では、r がぴったり
1 にならない可能性が高 いので、正しく動作しない 可能性が高い。 double r = 0.0; while (r != 1.0) { ... r += 0.1; }
問3-3 int a; a = a + 3;
解3-3: 初期化を忘れる 変数を宣言すると初期 値は0だと思い込んでい ろんな処理をしてしまう。 とても大きくおかしな値 が出力される時はだい たいこれが原因である。 コンパイル時にエラーが 出ない。
int a = 0; a = a + 3;
問3-4 if (a = b) break;
解3-4: "=" と "==" を間違える 初心者にとてもよくある 誤り。左の例の場合、コン パイルでエラーは出ない ことに注意。 if
(a == b) break;
問3-5 for (i = 1; i < 10; i++); printf
("表示\n");
解3-5: ';'のつけすぎ エラーも出ないので初心 者にはかなり気付きにく い。 C言語の「文末」には ; が 必要と覚えていると、左 の例のように
for 文にま でつけてしまう。 for (i = 1; i < 10; i++) printf ("表示\n");
問3-6 // aが 0 以外なら"表示2"を表示させたい if (a == 0) if
(b == 0) printf ("表示1"); else printf ("表示2"); }
解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"); }
レベル4: アルゴリズムの誤り (0問)
アルゴリズムの誤り • そもそもプログラム以前にアルゴリズムが間 違っている場合。 – 例えば、4行4列の行列式にサラスの方法を用い る、など。 • 自分では正しいと思っているからそのアルゴリズ ムを使用しているため、間違いに最も気付きにく
い。 – 検証可能な出力をする、などの方法で確認するし かなく、場合によっては検証できない問題もあ る。
おわりに
間違いを減らすために • エラーが出ている場合は、エラーメッセージをよ く読む – 英語の場合は読むのが大変だが、それでも読ん だほうが近道だ • エラーが出ない誤りの場合は、このスライドで紹 介したような誤りをよく記憶しておく
– 出力結果が何かおかしいと感じた時に、「気付き にくいエラー」をしていないかよく考える
本スライドに関する照会先 山本 和英 長岡技術科学大学 電気系
[email protected]
このスライドは 2012年4月23日に作成しました。