P.98 変数の宣言は関数の先頭のみで有効

変数の宣言は、基本的に、関数の先頭でしか行うことはできません。 例えば、次のように変数を宣言することはできません。

#include <stdio.h>

int main(void)
{
    printf("Hello\n");
    int value;
    return 0;
}

実は、このプログラムは多くのコンパイラでは動いてしまいます。 それは、C言語の拡張版である、C++では使えるからです。 また、近年決められたC言語の新企画である C99 でも使えます。 しかし、元々のC言語では使えないと覚えていてください。

P.201 プロトタイプ宣言

どんな関数が作られているのか、前もって一覧にしておくようにすれば、いちいち関数を前に書いたり後に書いたりする心配はなくなります。
関数の一覧を作るには、関数の形を、プログラムのはじめの方に並べます。

#include <stdio.h>

int sum(void); /* プロトタイプ宣言 */

int main()
{
    return 0;
}

int sum(void) {
    printf("%d\n", (1 + 100) * 100 / 2);
    return 0;
}

このような関数の概要をプロトタイプ宣言と呼んでいます。プロトタイプ宣言さえしておけば、関数をどんな順序で書いても関係ありません。

注)GCCではプロトタイプ宣言無しでも通ってしまうことがあるよう。

P211 関数の戻り値(返り値)は1つのみ可

なんと、戻り値は1つだけしか返すことができないのです。

注)Goでは複数返せた。

また、戻り値を返さない関数を作ることも可能です。
その場合、引数名の前に、voidを指定します。

以下のような感じ?。

#include <stdio.h>

void printer(int);

int main()
{
    printer(10);
}

void printer (int x) {
    printf("%d\n", x);
}

P213 課題

問題6
 西暦年を入力するとオリンピックが開かれる(年かどうかを)表示するプログラムを作成せよ。
ただし、オリンピックの開催を計算する部分は別の関数として作成せよ。
 ただし、2000年に夏の大会が開かれ、その後は2年ごと冬->夏->冬->夏の順に開かれるとする。
また、この予定は永遠に狂わないこととする。

後でやる。

P226 グローバル変数は自動で初期化される

(グローバル)変数 count は初期化していないにも関わらず、綺麗に出力されましたが、(中略)
グローバル変数は、プログラムの開始時に自動的に0に初期化されるのです。
ローカル変数は関数の呼び出しのたびに作られ、そのたびに初期化していると無駄になるので自動的に初期化しないのですが( 以降略)

#include <stdio.h>

int count;//  初期化していない

void countFunc(void) {
    count++;
    printf("%d\n", count);
}

int main(void) {
    countFunc();
    countFunc();
    countFunc();
    return 0;
}

P230 静的なローカル変数

関数的なローカル変数を宣言する時に、型名の前に static とつけることで、 静的なローカル変数を宣言することができます。

#include <stdio.h>

void countFunc(void) {
    static int count; /* 静的なローカル変数 */
    count++;
    printf("%d\n", count);// 出力結果は  `1 2 3`
}

int main(void) {
    countFunc();
    countFunc();
    countFunc();
    return 0;
}

P.243 配列の長さを求める

array に対して「長さを求める関数・メソッド」といったものが存在しない(?要確認) のため、 sizeof 演算子を使用して長さを計算する。
> 配列全体のサイズを求め、それを要素1つのサイズで割れば要素の数がわかります。 C言語には、変数や配列のサイズ(バイト数)を求める sizeof演算子があります。

int main(void) {
    int array[] = {42,79,13};

    for (int i = 0; i < sizeof(array) / sizeof(array[0]); i++) {
        printf("array[%d] = %d\n", i, array[i]);
    }

    printf("length is %lu", sizeof(array) / sizeof(array[0]));
}

array[0]としているのは、0番の要素は必ずあるからです。