あかかげまるのC言語入門
かなり面白い(funny的な意味で)内容だったので、紹介します。
※誤字脱字はありすぎるので、基本的にスルーします
●あかかげまるのC言語入門
まずはトップページから、いきなりおかしなことが書かれています。
いやどう考えてもメモ帳いらないでしょ。メモ帳縛りとか全力でお断りします。Cを書いてみるのに必要なもの
1. コンパイラ
2. メモ帳
3. 根気
デタラメすぎ。「コンパイル」の説明だとしても、明らかにソースファイルの保存はコンパイルではありません。まず1のコンパイラとは、プログラムをまずメモ帳などに記載して、任意のファイル名.cとして保存し、パソコンが読める様に機械語に変換及びファイル名.exeファイルを生成する作業になります。
●C言語 出力(printf)の復習
ここ自体はおかしくないですが、「手入力」これは伏線です。後で回収します。メモ帳に上のソースを書いて見てください。出来れば、コピー&ペーストではなく気ボードから手入力すると、最初の#include とか とかを徹底して覚えたほうが早く飲み込めると思います。
良くないです。(少なくとも今の常識では)完全に間違っています。コンパイルエラーになります。最後に printf で出力したい部分は 必ず("出力させたい文字等"\n);
※ カッコ ダブルクウォート 【出力させたい文字等】 ダブルクウォート \n 閉じカッコ セミコロン
と覚えておくと良いようです。
このページの上のコードとも矛盾しています。
…こう覚えておくと、書くときは正しく書ける特殊な脳の持ち主なのかな?※効果には個人差があります
●C言語 変数値の代入プログラムで簡単な計算
早速先ほどの伏線回収です。なんとサンプルコードに全角スペースが含まれています。
おそらく、コピペで手を抜こうとした人をこらしめるためでしょう。
(今のところ)メモ帳を使うと全角スペースは表示されない(フォントによる?)ので、
サクラエディタなどを使った場合と比べて発見が遅れるでしょう。
いや、ちゃんと書いてあげないとダメでしょ。下の例 で 【 int a; 】と宣言しています。コンパイラにこれから【 a 】と言う整数を格納する場所を使いますと書いてあげないと言う決まりです。
おそらく誤字でしょうが、逆の意味になっています。プログラムを書くときも気を付けないといけないですね。
●C言語 数値を入力してみる(scanf)
必ず&をつけないといけない決まり…なんか怪しいなあ… でも、これは「変数に代入」とは言えないのか…?【 scanf 】関数を使い変数に代入する場合は必ず &をつけないといけない決まりです。(&の後ろは宣言した変数文字例を指定ます。)
と思っていたら
自分で汚染だと認めてしまいました。【 scanf 】関数を使用する場合は、変数の前に必ず【 & 】が必要です。akakagemaru汚染の部分ですね。
C言語をちゃんとわかっている皆さんは、このような汚染に影響されてはいけませんよ。
そんなルールは聞いたことがありません。最後の出力ソースで、%fの後ろにドットが必要となります。下図参照。実行の際ドットが無い場合にエラーとなります。
試しにIdeone.comで実行してみましたが、ドットがあっても無くてもreturn 0;をしないとRuntime Errorとなり、
return 0;をするとSuccessになり、出力も正常でした。
ちなみに、この上のプログラムの二重引用符の位置が間違っています。
きっと先ほどの間違った覚え方により、間違ったコードを書いてしまったのでしょう。
さらに、スクリーンショットのコードは円周率が間違っており、実行結果も「ちゃんと」間違っています。
いや、気にしろよ。「決まり」と主張するのなら、何か出典があるのでしょうか?出力数値の後ろにドットが出力されてしまいますが、これは決まりなにで気にしなくていいようです。
そうでなければ、「ドットじゃなくて半角スペースなら?何も文字列が続かないなら?」などの実験はしなかったのでしょうか?
●C言語 gets関数を使用した安全な数値入力
最初に気がついた爆弾コンテンツ。
gets関数を使用している時点で
安全なわけがない。
さらに
「字牌列数」というのは意味がわかりませんが、文脈から考えて要素数のことと考えるのが自然でしょう。配列【 bb[80] 】(任意の字牌列数でOKです)を作成し、【 gets(bb) 】にて文字列として、数値文字を取得。
「任意の要素数でOK」ということは、当然1でもいいのですよね?
…はい、バッファオーバーラン不可避です。
安全に数値の入力を受け取るなら、やはりgetcharで1文字ずつ読み込み、
オーバーフローのチェックなどをしながら、
構文解析(数値1個だけならそれほどではないですが)をするのがいい気がします。
●C言語 文字型変数宣言charと配列
!?!?!?出力の際通常【 printf 】関数を使いますが【 getchar 】関数を仕様した場合は必ず【 putchar 】を使うと言う決まりがあります。
そんな決まりは聞いたことがありません。
筆者の俺ルールですよね?ね?ね?ね?ね?ね?ね?ね?ね?ね?ね?ね? ●C言語 if条件に当てはまるなら実行する条件文
C言語の仕様としては違う気がしますが、コーディング規約としては妥当でしょう。また条件を開始する 【 { 】カーリーブラケット、条件の終わりをを示す【 } 】カーリーブラケット閉じるが必ず必要になります。
他の場所と比べておかしくはありません。
●C言語 else if 多方向分岐させる
randが返す値の範囲は環境依存です。【 rand 】0~32768乱数を発生させる数学関数を使い、6の剰余(割った余り)を求めさせます。
試しにIdeone.comで というコードを実行したところ、1804289383が出力されました。
なぜ少なすぎる方はチェックしなかったのか…?
●C言語 switch多方向分岐(二ページ目)
どこにも「ss[1]~ss[78]になにか入力された場合はその他を実行」という判定は入っていないようです。ss[0]にY又はNいじゃ居の文字列又はss[1]~ss[78]なにか入力された場合はその他を実行します。
実行結果ではこのテストケースを全力で避け、ごまかしているようですね。
テストはきちんとしましょう。
●C言語 配列と文字配列の初期化
全力で数値型変数にポインタを代入していくスタイル。変数の初期化の場合は 例【 int a = "123"; 】変数に直接代入する形なのでわかりやすいですが
C言語なら(コンパイルオプションにもよるが)警告ですみますが、C++ならエラーです。
されません。Ideone.comで例2 【 char g[] = {'A', 'B', 'C', 'D'}; 】
以下のように確保&初期化されます。
[table=border:1px solid #cccccc;width:80%;][tr=background-color:#ffff00;color:#000000;text-align:center;][td=border:1px solid #cccccc;]g[0][/td][td=border:1px solid #cccccc;]g[1][/td][td=border:1px solid #cccccc;]g[2][/td][td=border:1px solid #cccccc;]g[3][/td][td=border:1px solid #cccccc;]g[4][/td][/tr]
[tr=background-color:#00ffff;color:#000000;text-align:center;][td=border:1px solid #cccccc;]A[/td][td=border:1px solid #cccccc;]B[/td][td=border:1px solid #cccccc;]C[/td][td=border:1px solid #cccccc;]D[/td][td=border:1px solid #cccccc;]0[/td][/tr][/table]
#include
int main(void) {
char g[] = {'A', 'B', 'C', 'D'};
printf("%u\n",(unsigned int)sizeof(g));
return 0;
}
●C言語 二次元配列
いや、char型の場合もちゃんと変数名を書かないといけないはずです。
三次元配列でも同様です。
●C言語 forを使った繰り返し条件(ループ)
間違いです。for文の「条件」の後ろにはセミコロンを付けないといけません。【 for 】分も前回勉強した【 if 】分と同様、条件の後ろには【 ; 】セミコロンをつける必要はありません。
下のサンプルではちゃんとセミコロンが付いています。
●C言語 continueループをスキップさせる