Software_C

☆C言語の規格と文法

※規格(この文書が準拠している訳でもない)

ANSI C

規格 C99 ISO/IEC9899
JIS X 3010:2003

◎文
│ 文;

◎main関数
プログラム開始処理により呼び出される最初の関数
│ main() {}

※main関数の定義
│ int main(void)
│ int main(int argc, char *argv[])
⇒ANSI Cの規格では、main関数の引数は0個か2個のどちらか

※仮引数
argc  仮引数の総計、非負の値
argv  引数文字列へのポインタの配列
│ argv[argc]はNULLを指す
│ argcが1以上ならばargv[0]..argv[argc-1]はポインタ
│ argcが1以上ならばargv[0]はプログラム名文字列

※第3の引数 envpを指定できる処理系もある
int main(int argc, char *argtv[], char *envp[]);
⇒環境変数へのポインタenvpは規格からは外れているので注意
⇒第3引数に、環境引数としてchar *envp[]を持っている処理系がある。(通常のUNIX系OS)。envpに渡させる文字列は以下の形式。最後はNULL。
│ 環境変数名=値
⇒envpを無視して宣言しなくても良いし、大域変数environにも格納されるので環境変数にアクセスは可能。

※自身のargvの文字列を書き換えることで、他のプログラムに対して、情報を伝えることが可能。例えばpsコマンドで調べることができる。

※main関数は、他の関数と同様、プログラムから呼んでもよく、再帰的に呼んでもよい。

◎定数

◆定数宣言
│ const 型名 定数名=値;
値が変更不可能なオブジェクトを指定する。
※組み込み用のコンパイラでは、変数をプログラムメモリに置くための宣言となることがある。

例)
│ const int a=123;
例)
│ int x=123;
│ const int *p; /*ポインタの指す先の変更不可*/
│ p=&x;
│ p++;
│ *pへの代入はできない。

◆リテラル
①小数点をつけずに数値を書くと可能な限り小さな整数型となる。
│ long型にしたい場合は、最後にLをつける。
│ 例)100L
│ 8進数にする場合は、0から数値をはじめる。
│ 例)012
│ 16進数にする場合は、0Xから数値をはじめる。
│ 例)0X12AB
②小数点のついた数値を書くとdouble型の浮動小数となる。
│ float型にしたい場合は、最後にFをつける。
│ long double型にしたい場合は、最後にLをつける。
③文字
│ 例)’r’

◎文字

◆空白類文字
│ ’ ‘    空白    0x20
│ ’\t’  水平タブ  0x09
│ ’\n’  改行    0x0A
│ ’\v’  垂直タブ  0x0B
│ ’\f’  FF    0x0C
※標準空白文字の’\r’復帰は、翻訳段階で’\n’に置き換わる。

◆コメント
/* ~ */


◎変数、オブジェクト型

◆変数宣言
│ 型 変数名;
│ 型 変数名=初期値;

例)
│ float pi;
│ float rate=130;

_◇void型
ポインタ型にのみ存在する

◆変数のアドレスを求める
│ &演算子による
│ 例)&i

◆ポインタ変数
│ 型 *変数名;

例)
│ int *p;
│ p = &i;

※ポインタ変数をポイントする先の値は、単項演算子*により、
│ *p
でアクセスできる。

_◇汎用ポインタ

※void *という型へのポインタは、任意の型(不完全型、オブジェクト型)にキャストできる。
⇒関数へのポインタと他のポインタには互換性がないので、変換してはならない。
(⇒サイズ、メモリ空間、語長が異なる可能性があるため、移植性が損なわれる)
⇒void型のポインタを逆参照するには型キャストする
⇒結果は保証されない。代入されてもエラーは出さない。

※不完全型
要素数を指定しない配列型
タグ名のみの構造体、共用体、列挙体
void型

※オブジェクト型
算術型、集成体型(配列型、構造体型)、共用体型、ポインタ型

◆オブジェクト型

①文字型
│ char
│ signed char
│ unsigned char
1バイト型。

②整数
│ int    整数型。実行環境に適した自然な大きさ。符号つき。
│   = signed int
│ short  char≦short≦intなる範囲の有符号整数型
│   = signed short
│ long int
│   =sigend long int
│ long long int

│ <符号なし>
│ unsigned int
│ unsigned long
│   =unsigned long int
│ unsigned short
│   =unsigned short int

③浮動小数
│ float  単精度浮動小数点型
│ double  倍精度浮動小数点型
│ long double

④列挙型
│ enum
列挙定数を順に並べていけば、0,1,2と列挙定数値が順次設定される。=で特定の列挙定数値を指定することもできる。

※列挙宣言
│ enum [列挙タグ]
│ {
│   列挙定数 [=汎整数定数式]
│   [,列挙定数 [=汎整数定数式]]
│ } [列挙名];

│ enum 列挙タグ 列挙名;

例)
│ enum abc
│ {
│   A,
│   B,
│   C
│ };

│ enum abc a;

│ a=A;

※#defineで定数を定義したものを並べるよりも、列挙型の方がよいかもしれない。

⑤void型
│ void
│   値は空集合。返却値なし。引数に使った場合は、引数なし。

◆その他の型
①clock_t  時計型
│ time.h
※clock関数の返却値を示す。

②time_t

③div_t
│ stdlib.h
※div関数の返却値。構造体
│ .quot  商
│ .rem  剰余
④fpos_t
│ stdio.h
※ファイル位置型。fgetpos, fsetposで使われる。

⑤FILE
│ stdio.h
※ストリームを制御するためのオブジェクト型。バッファへのポインタや制御変数などを含む。
例)
│ FILE *fs=fopen(“filename”,”r”);

⑥size_t
標準Cでの定義:ターゲットとするプラットフォームで生じ得る最大のオブジェクト(変数)の大きさを表現できるよう十分なバイト数があり、しかも必要以上に大き過ぎない符号なし整数型

◆記憶クラス指定子
※省略した場合、auto が指定されたことになる
①auto, register
│ 動的記憶期間の記憶クラス指定子。自動的に領域を確保し、自動的に開放する。registerの場合、アクセスが可能な限り高速になるよう示唆されるが、処理系に依存し、auto宣言として扱われる場合もある。

②static
│ ブロック有効範囲では、変数の静的記憶期間の指定。ファイル有効範囲のオブジェクトは常に静的記憶期間なので、static宣言することで識別子は内部結合指定となる。

※グローバル変数をstatic宣言することで他のファイルからは隠蔽される。
※ローカル変数をstatic宣言することで、プログラム実行中静的に存在しつづける変数となる。

│ 静的記憶期間のオブジェクトは初期化指定子がなければ0で初期化される。

③extern
オブジェクト(変数)や関数を示す識別子の外部結合を指定する。

_◇型修飾子
①volatile
│ 最後に格納された値が保持されるとは限らないオブジェクト。最適化は行われない。

◆型定義指定子
│ typedef 元型名 typedef名;
ある型を(元型名)をあらわす新しい名前をつける。(新しい型を作るわけではなく、同義語を作る。)
例)
│ typedef unsigned int uint;
│ uint  i;
例)
│ typedef struct {double re, im} complex;
│ complex z, *zp;
例)
│ typedef int int_arry3[3];
│ int_arry3  test1, test2;

◆関数型
プログラムで定義された関数を保持できる変数。

宣言例)

int (*func)(int, int);
※int型の2引数をとり、intを返す関数型の変数func

プログラムですでに定義されている関数

int add(int i1, int i2);

があったとき、

func = add;

として関数を変数に代入できる。

※関数名の後ろに括弧はつけない。

変数funcに代入した関数を利用する場合は、

i = (*func)(i1, i2);

のようにする。

◎配列

◆配列宣言
│ 型 配列名[個数];

※配列名はポインタではあっても,変数ではないというところが,ポインタ変数と唯一異なる

※配列へのアクセス
ポインタとして
│ *(i+1)=127;
としてもよいが
│ i[1]=127;

例)1次元配列
│ int data[4] = {1,2,3,4};
例)2次元配列
│ int data[2][2] = { {0,1},{1,2} };

◆2次元配列の関数渡し

下位関数側はポインタではなく2次元配列で受ける。ただし行の指定は不要で、列サイズを明らかにする必要がある。

例)  void func(int x[][5]);

上位関数では、通常どおり配列名を引数として与え、配列の先頭アドレスを渡せばよい

例)  func(x);

◎構造体、共用体

◆構造体
任意の名前がついたいくつかのメンバ変数が順に割り付けられた集合。

_◇構造体宣言


struct [構造体タグ]
{
│ 型指定子 メンバ名;
│ [型指定子 メンバ名;]
} [構造体名,…];


struct 構造体タグ 構造体名 [,…];

例)
struct int_real_tag
{
│ int x;
│ double y;
};

struct int_real_tag a,b;

※struct int_real_tagが型の名前となるので
│ struct int_real_tag x;
は、struct int_readl_tag型の変数xの宣言となる。

_◇構造体メンバの参照
①直接メンバー演算子
op1.op2
│ op1:構造体型、共用体型
│ op2:メンバ名
例)
a.x=123;
a.y=4.56;

②間接メンバー演算子
op1->op2
│ op1:構造体型、共用体型へのポインタ型
│ op2:指される型のメンバ名
※(*op1).op2 と等価。E.MOSは、(&E)->MOSと等価。
※ポインタを解決する*よりメンバ参照の.の方が優先順位が高いので、上の場合は常に括弧が必要。

※構造体で一度に代入も可能。
b=a;

※代入はできるが、比較演算子は使えない。

※構造体宣言例

①BMPのCLUT

typedefによる定義:

typedef struct
{
│ unsigned char  B;
│ unsigned char  G;
│ unsigned char  R;
│ unsigned char  filler;
} bmpCLUT;

宣言:

│ bmpCLUT clutB;

関数への構造体ポインタ引渡し:

│ initCLUT(&clutB, 0, 0, 0);

関数内での構造体操作:
void initCLUT(bmpCLUT *x, unsigned char r, unsigned char g, unsigned char b )
{
│ x->B=r;
│ x->G=g;
│ x->R=r;
│ x->filler=0;
}

※構造体によりリストや木などの再帰的データ構造を定義できる
②リスト構造の定義例
struct list {
│ int data;
│ struct list *next;
};

_◇構造体に対する操作
構造体全体に許されるのは
コピー(代入、引数、返り値)とアドレス演算子(&)のみ

※構造体の値が同一かどうかを比較するためには全メンバを調べるしかない

※構造体の中にはメンバ以外にアライメントのためのパディングが含まれる可能性がある。

※offsetofマクロ
構造体メンバのオフセットを知る。結果はsize_t型

struct foo {char a; int b;};

offsetof(struct foo, b)

◆ビットフィールド

構造体のフィールドの後に 「:」につづくビット数を指定することで、ビットフィールドを扱うことができる。複数のビットフィールドが1バイトに詰め込まれる場合もある。ビットフィールドに直接代入が可能。

◆共用体
任意の名前がついたいくつかのメンバ変数が重複している空でない集合。

※共用体は複雑なキャストをおこなわなくてもデータにアクセスできる仕組みとも考えられる。

_◇共用体宣言


union [共用体タグ]
{
│ 型指定子 メンバ名;
│ [型指定子 メンバ名;]
} [共用体名,…];


union 共用体タグ 共用体名 [,…];

例)
union bit_tag
{
│ unsigned z:8;
│ struct
│ {
│   unsigned h:4;
│   unsigned l:4;
│ } x;
};

union bit_tag a;

d = a.x.h;
a.x.h = a.x.l;
a.x.l = d;

_◇弁別子 discriminator
共用体の最後に格納したメンバを覚えておく変数や構造体のメンバ

構造体を使って、弁別子と共用体を1つにカプセル化する

例)
union foo {
│ int i;
│ double d;
};

enum Type {
│ Int,
│ Double
};

struct bar {
│ enum Type type
│ union foo u;
};

int main (void)
{
│ struct bar x;
│ x.u.d  = 12.34;
│ x.type  = Double;
}

※弁別子を使えば、適切な演算子を切り替えて使用することなどできる。

◆再帰的データ構造
構造体のメンバとして、その構造体自身へのポインタを含むようなデータ構造。

例)
struct Hist {
│ struct wordent Hlex;
│ int    Hnum;
│ int    Href;
│ struct Hist *Hnext;
} Histlist;

※Histlistは外部変数で、ヒストリリストの先頭を保持する。
※先頭の要素は、Histlistに格納せず、HistlistのHnextの指す先に格納すると、先頭の要素を特別扱いせずにプログラムできるようになる。(1要素の記憶域は無駄になるが)

◎メモリの確保と開放

◆メモリの確保と開放
メモリの確保はmalloc関数/calloc関数,メモリの解放はfree関数によって行う。
領域変更(開放と確保)realloc関数

_◇malloc/calloc

void *malloc(size_t size);
void *calloc(size_t nmemb, size_t size);
⇒size_tは符号なしだが、ゼロを与えても問題ない。
ただし、ゼロの場合、NULLポインタが返るかどうかは処理系依存。

例)整数変数の確保。
│ #include
│ int *p;
│ p=malloc(sizeof(int));

例)10要素分の配列領域の確保
│ p=malloc(10 * sizeof(int));
あるいは
│ p=calloc(10, sizeof(int));
⇒callocの場合、領域はゼロクリアされる。mallocでは不定。

※メモリが確保できなかったとき、malloc関数はNULLポインタを返す。
※sizeofはsize_t型で引数の型のメモリ必要量を返すが、mallocはsize_t型を引数としてとる。

例)ヌルチェック
│ if(p==NULL) exit(1);

※推奨される表記法

char *p;

p = (char *)malloc(sizeof(char));

※C++で p=malloc(sizeof(…)) とすると警告かエラーとなる
mallocが返すのはvoid*型のため。
⇒キャストが必須
p=(int *)malloc(sizeof(int));
p=static_cast(malloc(sizeof(widget)));

_◇realloc

void *realloc(void *ptr, size_t size);
⇒新旧領域のいずれか小さい方に格納されていた内容は引き継がれる

_◇free関数
確保したメモリの先頭アドレスを引数に渡す。
│ free(p);

p がNULLポインタであれば何もしない。
そうでなければメモリ領域を開放する。

◎ポインタ

◆NULL
空ポインタ。値0の汎整数定数式か、void*型にキャストされた0。

◆ポインタ変数に対する加算減算
ポインタに対する加算や減算は,アドレスを型のサイズだけ加算・減算することに相当する。

例)
│ *(p+1) = 100;

◆間接参照

例)
char *p1, **p2;
char c=’C’;
p1=&c;
p2=&p1;

※変数p2が保持しているのはp1へのポインタ
│ p2はp1へのポインタを記憶しているp2なる変数である
※変数p1が保持しているのはcへのポインタ
│ *p1, p1, &cは変数cへのポインタである。
※変数cが保持しているのは値’c’
│ **p2, *p2, cは’c’への参照となる。

例)
char s[]=”ABC”;

※変数sが保持しているのは配列sの先頭へのポインタ
│ *sは、配列先頭の文字’A’への参照となる。
※s+1, s+2, s+3は配列sの2、3,4文字目へのポインタ
│ 4文字目は空文字\0
※*(s+1),*(s+2),*(s+3)は文字’B’,’C’,\0への参照。

◆任意の型にキャストできるポインタ

void * 型

◆構造体へのポインタ
ポインタを解決する”*”より、メンバを参照する”.”の方が優先順位が高い。

struct point *p;

という構造体へのポインタを宣言した場合は、

(*p).x

のように () をつけて記す。上記の記法の代わりに

p->x

と書くこともできる。

◎制御構造

◆break
この文を囲む最小のswitch文か、反復文(for, while, do~while)の実行を終了させる。
例)
│ break;

◆continue
ループの中で continue 以降を無視し、ループの終わりに跳躍する場合につかう。

◆for
│ for([初期設定式];[継続条件式];[再設定式]) 文
①最初の1回だけ初期設定式の評価を行う
②継続条件式の評価を行い、結果が真(0以外)なら文を実行、偽なら終了する
③再設定式を評価、②へ戻る
例)
│ for (i=0;i<5;i++) printf(“i=%d\n”,i);

※forステートメントの3要素として、カンマ演算子でつないだ式を与えることで、一連の操作を行うことができる
例)
│ for (cnt=1, t=p; cnt<=cnt-orig; ++t, ++cnt) {…

※無限ループ
for(;;) {
│ …
}

◆while
│ while (継続条件式) 文
継続条件式の評価を行って、その結果が真(0以外)である間、文の実行を繰り返す。

例)
│ while (i<5) {文;}

例)無限ループ
│ while (1);

例)文字列を指すポインタpgmによる文字列のスキャン
│ while (*pgm != ‘\0’)
│ {
│   switch (*pgm++)
│   {
│   …
│   }
│ }

◆do ~ while
│ do 文 while (継続条件式);
はじめに文を実行した後、条件継続式の評価を行い、その結果が真(0以外)である間、文の実行を繰り返す。

例)
│ do {
│   b+=a;
│   ++a;
│ } while (a<=10);

◆switch ~ case
│ switch (制御式)
│ {
│   case 事例式: [ 文; 文 [break;]]
│   case 事例式: [ 文; 文 [break;]]
│   case 事例式: [ 文; 文 [break;]]
│   [default: [既定文群]]
│ }
制御式は汎整数型、事例式は汎整数型定数式。制御式の値と事例式の値に応じて特定の文に制御を移す。同じcaseラベルが複数存在してはならない。break文でswith本体ブロックから抜ける。一致するcaseラベルがなければdefaultラベルに制御がうつる。defaultラベルがなければ本体ブロックから抜ける。

※caseラベルのコードの最後にswitchブロックの外に制御を移すコード(break, return, continueなど)がないと、次のラベルを通過して下に落ちる。バグでなく、意図して通過させていることを理解させるために以下のコメントを付記すべきである。
│ /* FALLTHROUGH */

◆if
│ if (制御式) 真文 [else 偽文 ]
制御式の評価を行って、その結果が真(0以外)ならば真文を実行し、偽ならば偽文を実行する。else以下はなくてもかまわない。

例)
│ if (a<b) { │   c=1; │ } else if (a>b) {
│   c=2;
│ } else {
│   c=3;
│ }

◆switch

│ switch (制御式) {
│ case ケースラベル:
│   …
│   break;
│ …
│ default:
│   …
│   break;
│ }

※空のdefault節は無理に書かなくても宵が、書き忘れたのでなく、何もしなくて良いということが分かるので良い記述である。

◆goto
│ goto 識別子ラベル命;
※この文を含む関数内の識別子ラベルが付いた文へ無条件分岐をする。defaultラベルやcaseラベルには飛ぶことができない。
_◇ラベル
│ 例)
│   test:

◎演算子

◆算術演算子
①  +
②  -
③  *
④  /
⑤  %  剰余演算子
※「正%正」「負%負」では正の剰余を得るが、正負混合の演算結果は処理系依存。厳密な規格合致プログラムで正負混合の剰余演算を行う場合は、div, ldiv関数による。

◆ビット論理演算子
①  &
②  |
③  ^   XOR
④  ~

◆ビットシフト演算子
①  <<  左シフト
│   op1 << op2  op1をop2ビット分左シフトする。 │   空いたビットは0となる。 ②  >>  右シフト
│   op1 >> op2  op1が正ならop2分右論理シフトする。
│ ※op1が負なら論理シフトか算術シフトかは処理系定義

◆論理関係演算子
①  &&
②  ||
③  !

◆増減演算子
※オペランドの前につくか後ろに付くかで結果が異なる
①  ++
②  –

◆算術論理演算子
①  =  単純代入演算子
※オペランドの評価順序は不定であり、左辺の演算結果に依存するような場合は実行結果は不定となる。

②  +=  加算代入
③  -=  減算代入
④  *=  乗算代入
⑤  /=  除算代入
⑥  %=  剰余算代入
⑦  <<=  左シフト代入
│   op1 <<= op2
│   op1<<(op2)の評価結果をop1に代入 ⑧  >>=  右シフト代入
⑨  &=  ビット積代入
⑩  ^=  ビット差(XOR)代入
⑪  |=  ビット和代入

◆等非等号演算子
※真の場合は1、偽の場合は0
①  ==  等価
②  !=  非等価

◆不等号演算子
①  <  小さい
②  <=  小さいか等しい ③  >  大きい
④  >=  大きいか等しい

◆順次演算子「,」comma operator
│ op1, op2 …
op1を評価してからop2を評価する。op1の値は捨てられる。op2もしくは続く場合は最後の式の値が演算結果となる。
※関数呼び出しの実引数の並びなど、「,」が区切り子であるところでは使えないが、()でかこむか、条件演算子の第2引数では使える。
例)
│ f(a, (t=3, t+2), c);
│ f(a, a>0 ? t=4, t+3 : 77, c);

◆sizeof 演算子
①sizeof(型)
│ 型のとるバイト数を求め、size_t型で返す。
②sizeof 単項式
│ 単項式は評価されず、オブジェクトの大きさをバイト数で計算し、size_t型で返す。

※文字型が1であることを除き、処理系依存。
※配列は配列オブジェクトの総バイト数。
※構造体、共用体は詰め物含む総バイト数。
※ポインタはポインタの大きさ
注意)配列は配列の大きさが返されるが、配列のように添え字でアクセスしてもポインタの場合、返されるのはポインタの大きさとなる。動的に割り当てたメモリブロックのアクセスなどでは注意。
※mallocなどは引数にsize_t型の値を要求する。

◆アドレス演算子
│ &op1
※op1のアドレス(ポインタ)を求める。

◆キャスト演算子
│ (op1)op2

│ op1:型名
│ op2:キャスト式
※明示的に型変換を行う。

◆条件演算子
│ op1 ? op2 : op3
※op1を評価して結果が真(非0)ならばop2を評価し、そうでなければop2を評価する。op2,op3のうち評価されたオペランドの値を返す。

◎型変換

①キャスト演算子による明示的型変換
│ (op1)op2

②暗黙的型変換
│ 通常算術変換
│ ポインタ型変換
│ 関数の実引数の型変換

※printfは変換仕様からは暗黙的な型変換はしない。

◎関数定義

◆関数宣言
│ [ポインタ]関数名(仮引数宣言,..);

例)ANSI-C
main(int argc, char *argv[])
{

}

例)旧形式
main(argc, argv)
int argc;
char *argv[];
{

}

例)仮引数をもたずintを返す関数のプロトタイプ宣言
int fi(void);

例)仮引数仕様のない、intへのポインタを返す関数プロト
*fip();

例)仮引数仕様のない,intを返す関数へのポインタpfi
(*pfi)();

◆return
│ return [戻り値式];
※関数の実行を終了させ、制御を呼び出しもとへ戻す。1つの関数にreturnは任意の個数あってよい。式を伴ったreturn文は式の値を返却値とするが、void型の関数は戻り値を持てない。
※return文なしに関数の末尾にいたった場合は、式を持たないreturnと等価な動作をする。

※returnがもつ式を丸カッコで囲む記述が行われることがあるが、returnは関数ではないので不要。

◆関数プロトタイプ
関数は使うまえにプロトタイプ宣言する。プロトタイプ宣言には、関数が返す型、関数の名前、引数のデータを書く。

例)
│ void disp(int, float, char *);
例)
void initBMPheaderBW(bmpFileHeader *x, int w, int h );

※引数のない関数のプロトタイプ宣言では、()とせずに(void)とすること
⇒そうしないと古いCの仕様の「前方参照宣言」と解釈されてしまう。

◆省略記号「…」
可変長引数

※可変個の仮引数を示すために使われる。
例)
│ void f1(int argc,…)
│ {
│  …
│ }

◎フォーマット、出力変換仕様

※特殊文字、出力変換仕様
│ \n  改行
│ %d  int型10進整数表示
│ %hd  short型10進整数表示
│ %ld  long型10進整数表示
│ %f  doulbe型浮動小数表示
│ %Lf  long doulbe型浮動小数表示
│ %p  アドレス表示

◆出力変換仕様
%[フラグ][最小フィールド幅][精度][変換修飾子]変換指定子

①フラグ
│ 0個以上の以下の文字。
│ -  左詰め、このフラグが無いと右詰になる
│ +  有符号。このフラグが無いとマイナスのみ符号付き
│    プラスの代わりに空白をつける。0文字の場合にも空白が結果となる。+フラグがあると無視される。
│ #  表記法が分かる形式に変換する
│ 0  0詰めする。

②最小フィールド幅
│ 10進数字列  最小のフィールド幅を指定する
│ *      int実引数で最小フィールド幅を指定する

③精度
│ .10進数字列  精度を指定する(e,E,fでは小数点以下の桁数、g,Gでは最大有効桁数。sでは最大バイト数、d,i,o,u,x,Xでは最小の桁数)
│ .*      int実引数で精度を指定する
│ .      .0と同じ。

④変換修飾子
│ h  short修飾
│ l  long修飾
│ L  long double修飾

⑤変換指定子
│ d,i  10進整数
│ o  8進
│ u  符号無し10進
│ x  16進小文字
│ X  16進大文字
│ f  浮動小数
│ e  浮動小数e表記
│ E  浮動小数E表記
│ g  実数
│ G  実数
│ c  文字
│ s  文字列
│ p  ポインタ
│ n  整数のポインタ実引数にnまでに書かれたバイト数を格納、なにも書かない。
│ %  %が書かれる(表記としては「%%」となる)

◎入出力ストリーム

①stderr
│ 標準エラー出力ストリーム
②stdin
│ 標準入力ストリーム
③stdout
│ 標準出力ストリーム

☆特殊文字と前処理指令

◎前処理指令

◆#演算子
関数形式マクロの置換の並びにおいて実引数を通常文字列リテラル化する。前後の空白は削除され間の空白は1個に圧縮、「\」,「”」には直前に「\」が追加される。

例)
│ #define EX(s) puts(#s)
│ …
│ EX(a+b+c);
│   前処理後 puts(“a+b+c”);
│ …
│ EX(“ABC”);
│   前処理後 puts(“\”ABC\””);

◆#指令
空行を確保する

◆##演算子
置換の並びにおいて、仮引数を実引数に置換したのち、連結する。

例)
│ #define EX1(a, b) s##a+t##b
│ …
│ EX1(1,2);
│   前処理後 s1+t2;

◆#define
オブジェクト形式、関数形式のマクロ定義を行う。関数形式定義行のマクロ名と(の間には空白があってはならない。

#define マクロ名 [置換の並び]
#define マクロ名([仮引数の並び]) 置換の並び

例)
#define DEBUG 1

◆#if 制御定数式~#else~#endif
制御定数式を評価した結果が真(0意外)であれば#if以下を翻訳する。評価値が偽(0)であれば#else以下が存在すればそれを翻訳する。
例)
│ #if 1
│ …
│ #endif

例)
│ #if DEBUG
│ printf(“CMD[%c]”,c);
│ #endif

◆#ifdef マクロ名~#else~#endif
マクロ名が定義済みであれば#ifdef以下を翻訳する。未定義であれば#else以下が存在すればそれを翻訳する。
例)
│ #ifdef A
│ …
│ #endif

◆#elif 制御定数式
#if, #ifdef, #ifndefでの偽部での判定。
例)
│ #if A
│ …
│ #elif B
│ …
│ #endif

◆#error [前処理字句群]
前処理字句群を出力し、コンパイルを中止する。

◆#ifndef マクロ名~#else~#endif
マクロ名が未定義であれば#ifndef以下を翻訳する。

◆#include <h文字の列>
│ #include <h文字の列>
│ #include “q文字の列”
<>の場合、処理系定義の場所を順にさがしてヘッダやソースファイルを組み込む。””の場合、指定ソースファイルの内容と指令を交換する。
例)
│ #include

◆#line 10進整数定数 [“s文字の列”]
10進整数定数をソースファイルの行番号、 “s文字の列”をソースファイル名として変更設定する。以後の__LINE__,__FILE__マイクロの値などが変更される。

◆#pragma
処理系定義のコンパイルオプション。認識されない場合は無視される。

◆#undef マクロ名
マクロ定義を無効にする。

◆defined
前処理制御行においてのみ認識される演算子。識別子が定義されていれば1, そうでなければ0と評価する。#ifdefのネストを避けて、1個の#if文で以下のように書ける。
例)
#if defined(A) && defined(B) && defined(C)
#define D 123
#endif

◎マクロ

◆_IOFBF, _IOLBF, _IONBF
│ stdio.h
setvbuf関数の第3引数で使われるバッファリング形式マクロ。
│ _IOFBF  完全バッファリング
│ _IOLBF  行バッファリング
│ _IONBF  非バッファリング

◆__DATE__
コンパイル日付の文字列リテラルを作るマクロ。
│ ”Mmm dd yyyy”形式

◆__FILE__
ソースファイル名を示すマクロ。

◆__LINE__
ソースファイルの行番号を示すマクロ。

◆__STDC__
規格合致処理系を示すマクロ。普通は1。

◆__TIMEE__
コンパイル時刻の文字列リテラルを作るマクロ。
│ ”hh:mm:ss”形式

☆標準ヘッダファイル

◆assert.h  プログラム診断ヘッダ
│ assert()を定義するが、NDEBUGがマクロ定義されていると、assert()はvoid式に変換される。
│ ※assert()は関数形式マクロである。

◆ctype.h  文字操作ヘッダ
│ 文字種別の判定と変換を行う関数群を定義する。

◆errno.h  エラーヘッダ
│ エラー条件の報告に関するマクロを定義する。

_◇errno  一部のライブラリ関数により正の整数エラー番号が設定される。いかなるライブラリ関数によっても0に設定されることはない。関数呼び出し前にerrnoを0で初期化し、その後でライブラリ関数を呼び出す。数学関数では、
│ ERANGE  範囲エラー
│ EDOM  定義域エラー
がエラーコードとして使われる。

◆float.h  浮動小数点ヘッダ
│ 浮動小数の数量的限界のマクロを定義する。
│ DBL_~  double型の特性
│ DBL_DIG  精度
│ FLT_~  float型の特性
│ FLT_RADIX  指数部表現における基数
│ FLT_ROUNDS  浮動小数点加算の丸めモード
│   -1  不確定的
│   0  ゼロ方向
│   1  最も近傍へ
│   2  正の無限大方向
│   3  負の無限大方向
│   他  処理系定義
│ LDBL_~  long double型の特性

◆limits.h  整数限界ヘッダ
│ 汎整数型の数量的限界のマクロを定義する。
│ CHAR_BIT  1バイトのビット数
│ CHAR_MAX  Char型の上限値(符号拡張により異なる)
│ CHAR_MIN  Char型の下限値(符号拡張により異なる)
│ UCHAR_MAX  Unsigned Char型の上限値
│ SCHAR_MAX  Signed Char型の上限値
│ SCHAR_MIN  Signed Char型の下限値
│ SHRT_MAX  Short int型の上限値
│ SHRT_MIN  Short int型の下限値
│ USHRT_MAX  Unsinged Short int型の上限値
│ INT_MAX    int型の上限値
│ INT_MIN    int型の下限値
│ UNIT_MAX  Unsigned int型の上限値
│ LONG_MAX  long int型の上限値
│ LONG_MIN  long int型の下限値
│ ULONG_MAX  Unsigned long int型の上限値
│ MB_LEN_MAX  全地域で使われる単/多バイト文字を確保するのに必要な最大バイト数

◆locale.h  地域化ヘッダ
│ LC_~    地域部門指定マクロ
│ lconv    数値の書式の要素を保持する構造体タグ

◆math.h  数学ヘッダ
│ 数学関数はdouble型の実引数をとり、double型の値を返す。
│ EDOM  定義域エラー
│ HUGE_VAL  数学関数が範囲エラーを起こし、オバーフローしているときの返却値の絶対値。

◆setjmp.h  非局所分岐ヘッダ
│ jmp_buf    環境退避変数型
│   ※BP,SP等を退避するための配列

◆signal.h  シグナル操作ヘッダ
│ SIGABRT    異常終了
│ SIGFPE    浮動小数点異常信号(0除算等)
│ SIGILL    不正命令信号
│ SIGINT    対話的な割り込み信号など
│ SIGSEGV    セグメンテーション違反
│ SIGTERM    プログラムへ送信する終了要求
※シグナルの意味と既定の処理は処理系依存

※signal関数の第2引数に使う
│ SIG_DFL    シグナルデフォルト
│ SIG_IGN    シグナルイグノア

※signal関数戻り値
│ SIG_ERR    シグナルエラー

│ sig_atomic_t
│   アトミックな操作可能な汎整数型

◆stdarg.h  可変個引数ヘッダ
│ va_list    可変個引数集変数型

◆stddef.h  共通定義ヘッダ
│ ptrdeff_t  2つのポインタの演算結果を示す型
│ size_t    sizeof演算子の結果を示す無符号整数型
│ wchar_t    ワイド文字型
│   拡張された文字集合の全ての文字をコード化できる

◆stdio.h  入出力ヘッダ
│ size_t    sizeof演算子の結果を示す無符号整数型
│ EOF        ファイルの終わりを示す値
│ FILENAME_MAX  最大ファイル名長(空文字分含む)
│ 例)
│   char fname[FILENAME_MAX];
│ FOPEN_MAX    同時にオープンされ得ることを処理系が最低限保証するファイルの最大数。stdin,stdout,stderrを含めて8以上である。
│ L_tmpnam    tmpnam関数によって生成されるテンポラリファイルの名前の最大長を示す。
│ SEEK_SET    fseek関数。ファイルの先頭。
│ SEEK_CUR    fseek関数。ファイルの現在位置。
│ SEEK_END    fseek関数。ファイルの終端。
│ TMP_MAX      tmpnam関数が生成するファイル名の最大数。
│ wchar_t    ワイド文字型
│   拡張された文字集合の全ての文字をコード化できる

_◇BUFSIZ  setbuf関数により使われるバッファの大きさ

◆stdlib.h  一般実用ヘッダ
│ size_t    sizeof演算子の結果を示す無符号整数型
│ EXIT_SUCCESS  exit関数の引数。成功終了
│ EXIT_FAILURE  exit関数の引数。不成功終了
│ ldit_t      ldev関数で返される値の型
│ MB_CUR_MAX    現在地域のLC_CTYPE部門によって指定される拡張文字集合の多バイト文字1文字を確保するのに必要なバイト数
│ RAND_MAX    rand関数で返される最大値(整数)を示す。

◆string.h  文字列操作ヘッダ
│ size_t    sizeof演算子の結果を示す無符号整数型

◆time.h  時間ヘッダ
│ size_t    sizeof演算子の結果を示す無符号整数型
│ CLOCKS_PER_SEC  clock関数の返却値の1秒あたりの数。返却値をこの定数で割ることで秒単位となる。
│ time_t    暦時間型
│ tm      詳細時間を保持する構造体タグ