C言語

C言語

C言語を勉強したときにまとめたノウハウ集。

・制御文
    TRUE  = 0以外
    FALSE = 0
    NULL  = 0
    EOF   = 負の整数 (通常は-1) 

    if文、while文等は0以外(TRUE)の時に処理が実行される。
        例1:
            char ch;
            ch = getche();
            while(ch!='q') ch = getche();
            printf("qが入力されました");

        例2:
            if(i)
                if(j) printf("iとjは真");
            else printf("iは真");   
            /* このelse文はif(j)文に対するelse。(字下げが紛らわしいが) */

    演算子の優先順位
        高  ( ) [ ] -> .
        ↑  ! ~ + - ++ -- (型キャスト) * & sizeof
        │  * / %
        │  + -
        │  << >>
        │  < <= > >=
        │  == !=
        │  &
        │  ^
        │  |
        │  &&
        │  ||
        │  ?:
        ↓  = += -= *= /= など
        低  ,

・インクリメント演算子/デクリメント演算子
    インクリメント
        i = i + 1 を i++ と記述することができる
    デクリメント
        j = j - 1 を j-- と記述することができる

      例1:
        i = 10;
        j = i++;                    /* jに代入してからインクリメントされる */
        printf("i=%d j=%d",i,j);    /* 「i=11 j=10」が表示される           */

      例2:
        i = 10;
        j = ++i;                    /* iをインクリメントしてからjに代入する */
        printf("i=%d j=%d",i,j);    /* 「i=11 j=11」が表示される            */

      例3:
        max = 1;
        count = 10 * max++;
        printf("count=%d max=%d",count,max);  /*「count=10 max=2」が表示される */

・ビットごとの演算子
    & … AND
    | … OR
    ^ … XOR (排他的論理和)
    ~ … 1の補数 (0と1を反転)

        例1:
            int i = 100;
            i = i ^ 21987;
            printf("XORの値は%d",i);  /* 「XORの値は21895」が表示される */
            /*
                  0101 0101 1110 0011 (10進数の21987)
                ^ 0000 0000 0110 0100 (10進数の100)
                ───────────
                  0101 0101 1000 0111 (10進数の21895)
            */

        例2:
            char ch = 'a';
            ch = ~ch;     /* 1の補数(ビット反転) */


・シフト演算子
    値 << ビット数
    値 >> ビット数
        例:
            unsigned short u;
            u = 45678;      /*              1011 0010 0110 1110                       */
            u = u << 1;     /* 1ビット左へ  0110 0100 1101 1100 (一番左の1は削られる) */
            u = u >> 1;     /* 1ビット右へ  0011 0010 0110 1110 (一番左には0が入る)   */

・条件演算子
    if文の代わり"?"を使用できる。
    変数 = 条件 ? 式1(真): 式2(偽);
        例1:
            int i = rand() % 2 ? 1 : 0;
            if(i) printf("表");
            else  printf("裏");
        例2:
            rand()%2 ? printf("表") : printf("裏");

・代入演算子
    例:
        i = j = k = 1; /* i,j,kに1を代入 */
        a += 5;        /* a = a + 5      */
        b &= c;        /* b = b & c      */
        i <<= 3;       /* 2を3回掛ける   */

・代入文での型変換
    例1:
        int i;
        char ch;
        i = 1000;
        ch = i;
        printf("%d",ch);  /* 「-24」と表示される(下位8ビットのみコピー) */
    例2:
        int i;
        float f;
        f = 1234.0098;
        i = f;
        printf("%f %d",f,i);  /* 「1234.0098 1234」と表示される */
    例3:
        short int si;
        long int li;
        li = 100000;
        si = li;
        printf("%hd",si);     /* 「-31072」と表示される */
    例4:
        int i;
        long double ld;
        ld = 10.0;
        i = ld;
        printf("%d",i);  /* 「10」と表示される */
    例5:
        float f;
        f = 10 / 3;
        printf("%f",f);  /* 「3.000000」と表示される */

・カンマ演算子
    例1:
        for(i=0, j=0; i+jj ? i : j

        int main(void)
        {
            printf("%d\n", MAX(1,2));
            printf("%d\n", MAX(100 && -1,0)); /* ←これは間違い (例3が正しい使い方) */
            return 0;
        }
    例3:
        /* #defineを以下のように修正すると、例2を使用できる */
        #define MAX(i,j) ((i)>(j)) ? (i) : (j)

        int main(void)
        {
            printf("%d\n", MAX(1,2));
            printf("%d\n", MAX(100 && -1,0)); /* ←これは正しい */
            return 0;
        }

・#演算子
    例:
        #define MKSTRING(str) # str

        int main(void)
        {
            int value;
            value = 10;
            printf("%s の値は %d です",MKSTRING(value), value);
                                /* 「value の値は 10 です」と表示される     */
                                /*  #演算子は、引用符付きの文字列に変換する */
            return 0;
        }

・##演算子
    例:
        #define output(i) printf("%d %d ", i ## 1, i ## 2)

        int main(void)
        {
            int count1,count2;
            int i1,i2;

            count1 = 10;
            count2 = 20;
            i1 = 99;
            i2 = -10;

            output(count);
            output(i);
            /* 「10 20 99 -10」 と表示される */

            return 0;
        }