ルギア君の戯言

雑多な記事。

チャイニーズ!

明日のプログラミングのテストで、C言語を友達に教えるため、今日のチャイニーズの授業をサボってしまった(ぇ


ごめんなさい(ここで謝ってどうする


ちなみに、明日のテスト、重要ポイントは「構造体」だって。


僕的には、「ポインタ」のほうが大変だと思うけど、「構造体」や「共用体」は始めて出てきたやつだからしょうがないか。

一般的な意見 (理解のし難さ)

その他 < 構造体 < 共用体 < ポインタ

同学年の意見 (ポインタは嫌というほどやっているためか・・・)

その他 < ポインタ < 構造体 < 共用体

C++ (ルギア君なりの考え)

その他 < 構造体 < 共用体 < クラス (継承以外) < I/Oシステム (cout とか) < ポインタ < 「参照」 < クラス (継承) < RTTI < STL

定義と宣言

「定義」は「実体が用意される記述」。
「宣言」は「実体は用意されず、名前だけを使えるようにする記述」。

見にくくて済まない。
はみ出ていたら横にスクロールして見てくれ。

#include <stdio.h>

struct seiseki {
    int kokugo;
    int sansuu;
    int rika;
    int shakai;
}; /* 宣言。struct seiseki の中身にどういうものが入っているかは
      わかったが、実体を用意する必要はないよね! */

struct seiseki student; /* 定義。宣言だけじゃ、メモリに書き込めないよね!*/

typedef int* IntPointer; /* 宣言。これも実体は要らない。*/

int max(int a, int b); /* 宣言。どこに内容があるか知らないけど、
                          max という関数をこれから使います! 
                          というもの。 */

int main() { /* 定義。中身がある。 */

    int i;   /* 定義。この記述は、実体を用意する。
                (でないと i は使えないよね!) */

    extern int j; /* 宣言。extern (外部の)がついている。
                     j という変数がどこかにあるから、
                     それを参照してくれ! という記述。 */

    char* c; /* 定義。ポインタかどうかは関係ない。
                実際に文字列を入れるためのメモリは確保しないが
                それを指すためのアドレスを入れるためのメモリを
                確保する。 */

    i = max(i, j); /* 上で宣言したから、ここで使える。
                      が、その動作は根本的には保証されていない。 */

    printf("%d\n", i); /* printf は stdio.h の中に
                         「宣言」が記述されている。
                          実体はさらに別の場所にある。*/
    return 0;
}

int max(int a, int b) { /* 定義。main 関数と同じ。*/
    return (a > b) ? a : b;
}

引数をチェックするな とは

#include <stdio.h>

int no_argument(void); /* void を指定すると「引数なし」*/
int arg_no_check();    /* void を省略すると「引数をチェックするな」*/

int main() {
    printf("%d %d\n", no_argument(/* 1 */),
                      /* ↑ は引数があるとエラーになる。*/
                      arg_no_check(55));
                      /* ↑ は引数があってもエラーにはならない。
                         それは、引数の型と個数をチェックしないから。*/
}

int no_argument(void) {
	return 1;
}

int arg_no_check(int a) { /* 実際には引数がある */
	return a;
}


ちなみに、C++ では、void が指定してあっても指定してなくても「引数なし」になります。上のプログラムをそのまま cpp になおしてコンパイルすると、

error: too many arguments to function ‘int arg_no_check()’

といったように 引数の数が多いです って叱られます。