明日のプログラミングのテストで、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()’
といったように 引数の数が多いです って叱られます。