2020/09/03

エド君と学ぶC講座5

今回の内容 簡単な復習 C言語の性質 ミスしがちな内容





エド君「さて今回は箸休めとでもいくか。まずは今までにやってきた関数の簡単な整理をしていく。」

printf 文字の出力。%dで10進数、%fで浮動小数点数を出すことができる。その他に%u、%sなどもあるがこれは使うときにまた…

scanf キーボードから入力された値を格納する。格納したい変数の前には基本的に&を
つけるがつけないものもある。これの説明も使うときに…

puts printfと似ているが自動的に改行が入る。

putchar 1文字のものを出力する際に使う。'A'のように'で文字を囲む。

if 式を評価しその条件に合うかで分岐させる。else ifやelseと組み合わせて使うことが多い。

switch 複数の分岐があり、式が同じ場合にはこっちのほうが使いやすい。

do do~whileで使う。他のループ系に比べるとあまり使わない。

while do文が判定が1度実行された後に対して実行前に判定される。こっちの方が使うが条件次第ではループが1度も実行されないこともある。

for 最大3つの式で条件や行動を表す。制御式(真ん中の式)以外は省略することもできるが制御式を省略すると無限ループと化す。


エド君「まあこんなところだな。さてここからはC言語のちょっとした性質の話をするか。まずは識別子…変数とかに使うやつだな。これの制限の話だ。これは先頭が非数字、2文字目以降は数字でも非数字でもよくなっている。」
つまりはx1はいけるけど1xはいけないってことか。
エド君「ああ。あと大文字と小文字は区別されるからABCとabcは別の識別子になる。非数字のなかにはアンダーバー(_)も使えるがそれ以外の記号とかは使えねぇ。abc@とかはできないわけだな。」
つまりはtako_addは識別子として使えるのか…
エド君「あとはifやforのように変数に使えないものもある。まあ基本的には既存の関数やそこで使うものは対象外ってことだ。」






そういやプログラム見てるとなんか字下げされてるけどあれっていったい?
エド君「インデントの話だな。段落中のものをずらして書くと構造がわかりやすくなるというのと環境によっては並べると不都合が起きることもあるんだよ。あとそういう風に書くと読みやすい。C言語には記述にある程度の自由さがあるんだが…」



#include<stdio.h>

int main(         void) { printf("Hello world!"
);
    return 0
        ;
}

エド君「こんな書き方でも動くのは動くが…わかりにくいだろ?」
これはひどい。
エド君「自由形式自体は認められてはいるが流石に見る側につたわりにくすぎる。初歩的なhalloworldでこのざまだからな。さらに複雑な内容だと自分で見直したときにも混乱しかねない。あと自由形式とはいえ例えばintやreturn、演算子の間に空白を入れるとエラーになるし最初にあるincludeのような#がつく処理は分離ができねぇ。」

#include
<stdio.h>

エド君「こう書くとエラーになる。」
そういえば長文書きたいときに行変えるとエラーになったんだがあれってどうすりゃいいんだ?
エド君「たまにあるやつだな。中身が長くなって見づらくなること。」

printf("口は悪いけどほんとは優しいし抱えてる闇深すぎるしギャップがカワイイ。
そう。エド君はカワイイんだよ。");

こういうのを入れたかったんだが…
エド君「文章が変なのは置いといてそういう場合は行ごとに"で囲むといい。」

printf("口は悪いけどほんとは優しいし抱えてる闇深すぎるしギャップがカワイイ。"
        "そう。エド君はカワイイんだよ。");

エド君「こうすりゃ長文でも見やすくなる。あと個人で見返す時や相手にわかりやすいプログラミングを作るならコメントの挿入をするといい。」
コメント?
エド君「ああ。例えばだが…」


/*読み込んだ数字は奇数か偶数か*/
#include<stdio.h>

int main(void) {
    int x;
    printf("エド君「数字を入力しろ。」");
    scanf("%d", &x);
    if (x % 2)

        printf("エド君「その数は奇数だ。」"); //2で余りが出る。
    else
        printf("エド君「その数は偶数だ。」"); //2で割り切れる。
    return 0;
}

エド君「/**/や//でコメントをつけることができる。複数人での作業なら必須だな。こういうのを残しておくとどういう動作なのかとかがわかりやすくなる。あとは初心者がやりがちなミスとかの話もするか。」

・stdio.hをstudioとかく。

エド君「英単語のほうで書きがちなミスだ。」
あるわ…stuまで書いてあ、違うってなるやつ。
エド君「動かねぇと思ったらそもそもここが違っていたというオチだな。」

・半角と全角を間違える。

エド君「出力される文字とかなら全角でも良いんだが括弧やセミコロン、空白が全角になっていてエラーになることがある。ここは半角でやるということを覚えるしかねぇな。それでもたまにやらかすんだが。」
あー…これ空白が全角だとわかりにくいな…気をつけねば。

・綴りのミス。

エド君「まあ最初のもこれなんだが動かないと思っていたらprintfがprinfになってたとかあとこれはPythonとかしてるとやりがちなんだがprintで書いて動かないってパターンだな。」
Python?
エド君「そういうプログラミング言語があるんだよ。あっちだとprintで動くからfを付け忘れるとかな…」

・=と==の間違い。

エド君「=は代入==は等しいかの判別なんだがそもそも==を使うべき所で=を入れてエラーになるもありがちなミスだな。」
どうしてもa=bで2つが等しいって認識になってしまうんだよなあ…

・;の付け忘れ

エド君「printfとかの後ろは;をつける必要があるんだがこれを忘れることも多い。あと逆のパターンとしてforとかのつけなくて良いところでつけてしまうこととかもな。」
なんにでもつけて良いわけじゃないのか…困ったらつけとけば解決…ともいかないんだな。

・変数の宣言し忘れ。

エド君「変数を複数使っていたり途中で増やしたいとなったときに宣言漏れが起こるときがある。」
確認大切だな。

・配列の範囲の勘違い。

エド君「配列に関しては次の回でやる予定なんだが先にミスしやすいとこを言っておくと
int a[10]ってなってるやつはこの10は0~9の10個で10番目は10じゃなくて9になるという仕様がある。つまりa[9]までしかないということだ。」

・{}の数が合わない。

エド君「{で始めたら}で閉じる必要があるんだがこれの数が合わずにエラーになる、括弧の位置がおかしくて挙動が合わないという事が起きる。とくに長文になると数がわかりにくくなるんだよなこれが…」
んでどこに入れたら良いかわからなくなるやつ…つらみ。

・そもそもなんでエラーが起きているのかがわからない。

エド君「そんな馬鹿なとなりそうだが以外と何が原因なのか分からないとかエラー表示はないのに動かそうとしたらエラーを吐くとかな…まあ表示される場合はそのエラーを読めば良いんだが英語表示も多くてわからねぇってやつもいるな…」
あるある…できたと思って起動したら例外がどうのこうのって出てなにも分からないとき…
エド君「分からないときに相談できる相手がいるとプログラミングは特に心強いんだが…」
やめろ。私みたいな陰キャにはエド君くらいなんだよ頼れるの。






エド君「さて。今回は小休憩だったが次からはまたいろいろと教えていくぞ。次回は途中でも語った配列の話だ。」