Tosainu Lab

C言語はこうやって教えてくれればいいなって思っただけ

どーもです

プログラミングの教育で、よく “おまじない” って使われますよね.
例えばC言語なら

#include <stdio.h>

int main(void) {
  // なんか処理

  return 0;
}

みたいなのを “おまじない” と教えられ, 「難しいからスルーしましょうね」と流されるわけです.

これっておかしくないでしょうか. 上に挙げたコードだけでもかなり重要なことが書いてあるのに.
ってことで, 僕流に “こうやって教えればいいんじゃないか” ってことを思いついたので書いてみようと思います.

まぁ僕もプヨグヤムなんてパーペキねな人じゃないんで, 「あっ、そう。」な感じで見てもらえれば.

0. まず

先に挙げたコードには重要なことがたくさん書いてあります.

  • ヘッダファイルの読み込み
  • 関数の宣言および引数やreturn型の設定
  • 関数の値の返し方

こんな重要なことをスルーなんかしたらアカンに決まってますね.

1. 初めてのプログラム, 関数

C言語は “関数” を記述して希望の値を得ることができるプログラムを書いていきます.
関数とは

ある変数に依存して決まる値あるいはその対応を表す式

関数 (数学) - Wikipedia

のことです.

C言語ではこのように関数を宣言します.

戻り値の型 関数名(引数) {
  // なんか処理

  return 戻り値;
}

注: “型” に関しては後述

関数名 : ルールに沿った任意の名前(長くなるので割愛)を指定. main関数が実行時一番最初に呼び出される.

引数(ひきすう) : 関数に渡す値を設定する. 値を渡さない場合はvoidを指定. また, main関数ではint argc, char *argv[]の2つを指定することでコマンドライン引数を受け取ることができる.

return : 関数の計算結果など “戻り値” の値をその関数の呼び出し元に渡すと同時に, その関数を終了する役目.

C言語では, 戻り値の型がintでmainという名前の関数が最初に呼び出されます. 例えば, 1+1の結果を返すCのプログラムはこのようになります.

int main(void) {
  return 1 + 1;
}
/// ビルド
$ clang myon.c

// 実行
$ ./a.out

// 結果(戻り値)の確認
$ echo $?
2

2. 変数と型

値を保持したり, 一時的な結果を保持するために変数というものを使います. 方程式のxやyとかと同じようなものです.
変数はこのように宣言します.

型 変数名;

型 : 変数には何でも入れることはできず, 型に沿った決められた種類の値を入れることができます. : 例えば整数型のintや文字型のcharなどがあります.(その他の種類に関しては割愛)

型に値を入れるには代入演算子=を使います. また, 型に値を入れることを代入と言います.

int main(void) {
  // xという名前の整数型を宣言
  int x;

  // yという名前の整数型を宣言
  int y;

  // xに1241を代入
  x = 1241;

  // yにxに100を足した値を代入
  y = x + 100;

  // yの値を返す
  return y;
}

// 戻り値: 1341

3. 他の関数の呼出し

1でも書いたように, 関数は複数個宣言することができます. 他の関数はこのように呼出します.

// 関数func呼び出すだけ
func(引数);

// 関数funcの戻り値を変数xに代入
x = func(引数);

また, 関数は呼びだす前に宣言されている必要があります.

int func() {
// なんか処理
}

int main(void) {
  // funcは宣言されているので呼び出せる
  func();

  // 関数myonはコード内にあるが, まだ宣言されていないのでエラー
  myon();

  return 0;
}

int myon() {
// なんか処理
}

実際に, 引数の値を2倍にして返す関数を宣言し, 呼び出してみます.

// 引数のxの値を2倍にして返す関数twice
int twice(int x) {
  return x * 2;
}

int main(void) {
  int num;

  // numにtwice関数(引数に10)の戻り値を代入
  num = twice(10);

  return num;
}

// 戻り値: 20

4. ヘッダファイルのインクルードとstdio.h

今までは計算結果を関数のreturnで渡し, echo $?で確認してきました.
しかし, やはり実行した段階でコンソールに表示させたいものです.

そこで, 入出力のための標準ライブラリであるstdio.hを読み込んで(include), その中にあるprintf関数を使って文字列の表示をしてみます.

// stdio.hを読み込む
#include <stdio.h>

int main(void) {
  // ""内に文章を記述("で囲んだ部分は文章として扱われる)
  printf("Myon!! \n");

  // 整数の表示には%dを使う(その他printfの仕様に関しては割愛)
  printf("%d \n", 1341);
  return 0;
}

// 戻り値: 0
// コンソール出力:
Myon!!
1341

ちなみに, stdioはSTanDard Input/Outputの略です. studioではないです.

みたいな感じで, このあとifやfor等の文やポインタ, 関数の値渡しと参照渡しや文字列などのように進めていきます.

とにかく, #include <stdio.h>ptintfをおまじないとして流したくなかったんですよね.
最初の段階から関数だとかの決まりに触れるなどするといいんじゃないかなぁと思っています.

※ 上記の例はあくまで例であり, これでも結構重要なところを端折っています