やす流 Top


C言語


No.  項目 内容 備考
プリプロセッサ コンパイラの前に、行なうファイル操作のこと。
・#include→ファイルの挿入
・#define→マクロ定義をする
・#undef→マクロ定義の除去
・#if #ifdef #ifndef #else #elif #endif→条件付コンパイル
・#line→行番号の付け替え
・#pragma→コンパイラオプション指示 pack→構造体のアライメント指定
・#error→エラーの表示
・#→空指令
定義済みのマクロ名
__FILE__
__TIME__
__DATA__
__LINE__
__STDC__
定数 ・8進数→077、16進数→0xFF
・123456L、123456U、123456UL、12.22E10、1234.56F
・0~正の最大数~負の最小~-1、0と循環する。
・limits.h、float.hにANSI Cで決められた数値範囲が規定されている。
・\0→NULL(0)、\a→BEL(0x07)、\n→LF(0x0a)、\r→CR(0x0d)、\\→\を示す。
・文字リテラル→"yas"
 
変数とデータ型 宣言できる場所は、①関数の外②関数内の先頭部分③関数内の任意の ブロック{}の内部 (同じラベルなら、優先順位は③→②→①)  
int型の指定
記憶クラス 性質修飾子 符号修飾子 サイズ修飾子 基本型指定
auto  const  signed  short  int
static volatile  unsigned  long  
extern        
register        
 
浮動小数点型の指定
記憶クラス 性質修飾子   サイズ修飾子 基本型指定
auto  const    long  float
static  volatile    (×float)  double
extern        
有効桁数
float→6桁
double→15桁
列挙型
enum colortype { WRITE,GREEN,BLUE=10,RED } color;
0, 1, 10, 11 直接 GREENとしてしても良い。
enum coltyp {RED, BLUE, BLACK, AKA = 0, AO, KURO}; →RED=AKA=0、BLUE=AO=1、BLACK=KURO=2
 
const
const double pi = 3.14159;
char *strcpy(char *s1,const char *s2) → 2つ目の引数は変更しないという宣言。
int *const cnst_pt = &d1; →「cnst_pt」がconst
const int *pt_to_cnstvalue = &d2; →「*pt_to_cnstvalue」がconst
 
volatile→最適化しないように指定するときに使用。  
typedef
・typedef int *intptr;
 intptr p; →int *p;と同じ
・typedef char mystring[];
 mystring ss="abcde"; →char ss[] = "abcde";と同じ
・typedef int INT33[3][3];
 INT33 dt; →int dt[3][3];と同じ
・typedef void (*v_pfunc_i)(int);
 v_pfunc_i putdata;→void (*putdata)(int);と同じ
・typedef void v_func_i(int);
 v_func_i myfunc;→void myfunc(int);と同じ
・typedef struct man{char name[20]; int age;} mantype;
 mantype dt;→struct man df;と同じ
typedefは、コンパイラによる解釈。

#defineはプリプロセッサによる解釈。

配列 int yas[2][3];
yas[0][0]
yas[0][1]
yas[0][2]
yas[1][0]
yas[1][1]
yas[1][2]
 
型変換キャスト 計算式で色々な型、数値が混じっている場合、 計算する2項で大きな表現のできる型にキャストされ、その型で保持される。 ただし、明示的なキャストの場合はその指示に従う。  
記憶クラス auto,static,extern,register,typedef
・autoは自動変数で、通常省略。
・ローカルとグローバルで同じ変数名の場合、ローカルの方を優先させる。
・翻訳単位とは、1つのファイルtest.cで、ヘッダーファイルが その位置に展開された状態が、1つの翻訳単位という。
・externは、今の翻訳単位では実体の特定はせず、リンカにお任せと言う意味。
・ローカル変数で、static int dt=0;とするとその関数は、メモリに常駐し、 dtの値を保持し続ける。多分、コンパイラで初期値0と指定される。
・グローバル変数で、staticが付くと、その変数は、その翻訳単位でしか有効とならない。 これは複数の人との開発でのバッティングを回避することができる。
・registerは、レジスタを使いたいと明示する。 できるだけレジスタを使うようになる。→最近のコンパイラは、最適化が優秀なので、必要ない。
 
初期化 ・自動変数とレジスタ変数は、宣言毎に初期化される。(初期化していないと値は不定→ゴミ。式、定数式)
・グローバル変数及び静的変数は、コンパイル時に初期化されるだけ。 (初期化しないと、コンパイラでデフォルト0、定数式のみ「int i=a;」はダメ)
・「int a[3]={1,2,3};」「int a[3]={1,2,3,};」もOK。「int a[]={1,2,3};」でも同じ。
・「int a[2][3] = {10,20,30,40,50,60};」→a[0][0]=10,a[0][1]=20,a[0][2]=30, a[1][0]=40,a[1][1]=50,a[1][2]=60となる。
・「char s[6]="abcde";」=「char s[]="abcde";」「char s[8]="abcde";」残りの5,6,7は、0となる。 「char s[3]="abcde";」←エラーとなる。
・struct sdata pos = {100,200};
 
演算子 ・false→0 ture→0以外
・a=++b; → b=b+1,a=b;
・a=b++; → a=b,b=b+1;
・XOR(^) 0^0=0, 0^1=1, 1^0=1, 1^1=0
・補数(~) ビット反転
・条件演算子 「b=a>5 ? 20 : 30;」aが10の場合、bが20となる。 「a>5 ?(b=20) : (b=30);」でもOK。
・カンマ演算子 「a=10,b=20;」
①「#define getsmsg(msg,st) printf("%s",msg);gets(st)」→「#define getsmsg(msg,st) printf("%s",msg),gets(st)」
getsmsg("abc:",ss);
↓(展開)
printf("%s","abc:");gets(ss);
②スワップ動作 if(a>b)wk=a,a=b,b=wk;
③for文 for(i=0,b=10;i<5;i++,b+=10)
・sizeof演算子・・・マシン依存を回避するため。
p=(int *)calloc(1000,sizeof(int)); → sizeof(int)を4と書かない。
・本来は、size_t型を使う。→unsigned long
・int ary[8][10]; sizeof(ary); →OKで320となる。先頭アドレスだけでもそのサイズを求められる。
・dt[4]=1234; → 4[dt]は同じ位置を示すことになる。
 
制御文 ・if  if(1==yas)とすることで、if(yas=1)の=抜け間違いを コンパイラエラーすることができる。
・while
・for
・do-while
・switch
・break
・continue
・goto
・return
 
10 関数 ・関数にstaticを付けると、その翻訳単位だけで有効となる。 他の翻訳単位では無効となり、複数で開発したときに、間違いを防ぐことができる。
・可変個数の引数 int printf(const char *form, ...);
・ポインタを返す関数
int *pfunc(void)
{
 static int mydt = 0;
 return &mydt;
}

int main(void)
{
 int aa = *pfunc(); ← aaに0が入る。
}
・インライン関数・・・マクロのような展開不都合もおきない。

inline int yas(int a,int b){return(a+b);}

 
11 ポインタ ・void型ポインタ→void *ptvoid; キャストしてから、アクセスする。ptvoid++;などはできない。 →何かの型にキャストして使用する。(アドレスを保持しているだけ)
・ポインタのポインタ
 char **argv;
 printf("argv0=%s\n",*argv);
 printf("argv1=%s\n",*(argv+1));
 printf("argv2=%s\n",*(argv+2));
・関数を示すポインタ
fprt = myfunc; → 関数のアドレスをコピー
fptr(123);   → myfunc(123)を実行
 
12 構造体 ・構造体同士のコピー 同じ構造体を丸ごとコピーできる。 aaa = bbb;  
13 ビットフィールド ・ビットのパディング・・・未使用ビットを指定する方法が用意されている。
struct bitset{
 unsigned int busy :1;
 unsigned int :1; ←1ビットパディング
 unsigned int ready :1;
 unsigned int :3; ←3ビットパディング
 unsigned int send :3;
};
 
14 共用体 typedef union usmp {
 int it;
 short sh;
 char ch;
} Usmp;
Usmp u;
 
15 その他 ・行の継続 \で次の先頭から継続される。
・大文字、小文字は区別される。