二C言語基本データ型と演算子


  • C言語の基本データ型char、int、float、double 1>文字char(character)を単一引用符で囲む文字がcharです.は、「」は文字列を表します.例えばchar c='A';文字はグラフィックで表示されるが、記憶にはグラフィックの符号化(整数)が用いられるため、文字は文字とデータの二重特性を備えており、最初の文字符号化はASCII(American Standard Code for Information Interchange)符号化である.'A' = 65    'a' = 97    '0' = 48.文字は8ビットバイナリビット(bit)、1バイト(byte)を占めます.
    #include <stdio.h>
    int main()
    {
        char c1 = 'A';
        char c2 = 97;
        c1 = c1 + 1;
        printf("c1=%c
    ",c1);//B printf("c1=%d
    ",c1);//66 printf("c2=%c
    ",c2);//a printf("c2=%d
    ",c2);//97 printf("sizeof(c1)=%d
    ",sizeof(c1)); char c3 = '9'; int i = c3-'0'; printf("i=%d
    ",i); char c4 = -191;// -191 8 printf("c4=%c,c4=%d
    ",c4,c4); return 0; }/* : '9' 9*/
    附:sizeof()用法:sizeof(タイプ)、sizeof(変数)、sizeof(式)が計算タイプ、変数のメモリサイズ(バイト単位)sizeof(式)の場合、式は演算せず、結果のみを推定し、使用を推奨しません.

  • 練習:小文字を入力し、対応する大文字に変換して出力します.
    #include <stdio.h>
    int main()
    {
        printf(" 
    "); char c1, c2; scanf("%c", &c1); c2 = c1 - 'a' + 'A'; printf("c1 = %c, c2 = %c
    ", c1, c2); return 0; }

    C言語には、エスケープ文字という特殊な文字があります.例えば、
    改行文字''が成立
    rリターンキャラクタリターンロー行の先頭に戻り、次の行の先頭に戻る
    t水平タブビット(n個空)
       \\ \’\? "4文字の特殊文字の表示
    2>整数int(integer)
    int整数型は2バイトまたは4バイトを表し,現在主流機器は4バイト(32ビットバイナリ)を表す.整形には、次のものが含まれます.
    short int(略写short)短整型、2バイト
    long int(略記long)ロング整数、4バイト
    long long int(C 99)8バイト
    unsigned int符号なし整数(負以外)
    signed intシンボル整数(正負数)、デフォルト
    整数はバイナリ、8進数、10進数、16進数で表すことができます.
    整数型の原号表現法:
    signed intの第1ビットはシンボルビットと見なされ、0は非負数を表し、1は負数を表し、表現範囲:負の2の31次から正の2の31次-1;
    unsigned intは非負数であり、0から正の2の32次方-1を表す.
    シンボルがあるのとないのはメモリの中で同じで、違いは第1位をどのように処理するかだけです.有符号数は第1位を符号ビットと見なし,演算に関与せず,無符号数は第1位を数字と見なし,演算に関与する.
    #include <stdio.h>
    int main()
    {
        int a = -1;
        printf("unsigned a=%u,a=%d
    ",a,a); unsigned int b = -1; printf("unsigned b=%u,b=%d
    ",b,b); return 0; }

    進数変換(バイナリ-->10進数)
    16進法:0-9、10-15はa-f(A-F)で表される.
    8進数、10進数、16進数のC言語での表現方法:
    8進法は0で始まり、例えば011=8+1=9 int a=011である.
    16進数は0 X/0 xで始まり、例えば0 xF 1=15*16+1=241 int a=0 xF 1である.
    バイナリと10進数の変換:
    正数2->10
       0111 1011 = 64+32+16 +8+2+1 =112 + 11 = 123
       0101 1101 = 64 + 16  + 8 +4 +1 = 93
    正数10->2
       108 -> 108 -64 = 44 -32 = 12 - 8 =4 -4 =0 -> 0110 1100
               0   1        1     0   1     1  0 0
       87 -> 87 - 64 = 23 -16 = 7 -4-2-1  -> 0101 0111
    練習:0110 1011->107 125->0111 1101
    負数10->2
    対応する正数のバイナリ、それからビットによって逆を取って更に1(符号を補います)をプラスします
          -107 -> 0110 1011 -> 1001 0100+1=1001 0101
          - 58 -> 0011 1010 -> 1100 0110
    負数2->10
    まず1を減らしてからビットで逆を取って対応する正数を得て、前に-号を加えればいいです
    ビットごとに逆を取って1を加えて対応する正数を得て、前に-号をプラスすればいいです
          1101 1011 -> 1101 1010 -> 0010 0101 -> -37
          1101 1011 -> 0010 0100+1 -> 0010 0101 -> -37
          1111 1111 -> -1
    練習:-77->0100 1101->1011 0011
         1110 0111 -> 0001 1001 -> -25
    3>浮動小数点タイプ
    float単精度浮動小数点
    ダブル精度浮動小数点
    long double拡張デュアル精度(少ない使用)
    浮動小数点数は小数であるが、浮動小数点は近似値(コンピュータストレージに関連)である.
    注意:整数定数(フォント値)のタイプを指定します.
    3 intとされる
    3.5 doubleとみなされる
    3.5 fはfloatと考えられる
    3.5 Lはlong doubleとされています
    35 Lはlong intとされている
    35 LLはlong long intとされています
    35 uはunsigned intとされる
    35 ULはunsigned long
    しかし、タイプはタイプ変換が可能で、タイプ変換は実はメモリの変化です.
    2.C言語の演算子
    1>演算子の優先度:
    カッコの優先度が最も高い代入演算子(=)の優先度は極めて低い.
    2>演算子:+-*/%(余剰を取る)
    intを除いて、整数部分を取り、小数(小数部分を捨てる)がない.
    %は整数でのみ使用でき、小数では使用できません.
    intとdoubleを混合演算し、intをdouble演算に変換する.
    0除数も余すこともできません.そうしないと、浮動小数点数の例外(実行エラー)を引き起こし、プログラムを中断します.
    0.0は除数でき、結果はinf(無限大);
    #include <stdio.h>
    int main()
    {
        int a = 5, b = 2, c = 0;
        double d1 = 2.0, d2 = 0.0;
        printf("a/b=%d
    ", a / b);//2,3,2.5 printf("a%%b=%d
    ", a % b);//1 printf("a/d1=%lf
    ", a / d1);//2.0,2,5,2 //printf("a%%d1=%d
    ", a % d1);// , //printf("a/c=%d
    ", a / c);// , printf("a/d2=%lf
    ", a / d2);//a/d2=inf( ) printf("%d,%d,%d
    ", -9 / 7, -9 % 7, 9 % -7);//-1,-2,2 , (C99 ) printf("main over
    "); return 0; }

    注:C 89では負数に関する/%は不確定であり、C 99では除算が0に整い、残りi%jの記号をiで決定する.
    練習:92->29(整数の除算と余剰)などの2桁の逆順序印刷
    #include <stdio.h>
    int main()
    {
        int num, res = 0;
        printf(" 
    "); scanf("%d", &num); res = num%10*10 + num/10; printf("res=%d
    ", res); return 0; }

    3>代入演算子(=)
    代入演算子は、変数の値を変更できます.C言語では、++/--を除いて、変数の値は付与演算子でしか変更できません.代入演算子には、=+=-=*=/=... 
              a += b; -> a = a + b; 代入演算子は、右から左に計算されます.たとえば、次のようになります.
              a=b=c= 0;//c=0->b=c->a=b; しかし、このような書き方はお勧めしません.付与演算子は、右の値を左の変数に割り当てるため、左は式ではなく、変数であることが望ましい.左は左値とも呼ばれます.
              i+j = 10; 間違っています.左側は式10=iです.間違っています.左側は値で、10は定数で、値を割り当てることはできません.
    4>自己増加および自己減少(++/--)
    自己増加と自己減少は変数に対して、5++エラーです.++/--char、int、float、doubleタイプの変数に使用できますが、浮動小数点型変数は使用されません.
    自増と自減には2つの用法があり、前++(++i)と後++(i++)はいずれも自増1である.しかし、前++は先に増分してから演算し、++の後の数で演算に参加する.後++先演算後自増,++前の数で演算に関与する.(前++は連用可能、後++は連用可能)
    経験:i+/++iは単独で1つの文として現れ、他の文と混合しないでください.
    #include <stdio.h>
    int main()
    {
        int i=1,res;
        double d = 1.0;
        d++;
        printf("d=%lf
    ",d);//2.0 printf("i++=%d
    ",i++);//1 printf("i=%d
    ",i);//2 printf("++i=%d
    ",++i);//3 printf("i=%d
    ",i);//3 //res = i++ + ++i;//8 4+4 //res = i++ + i++;//6 3+3 res = ++i + ++i;//10 5+5 printf("res=%d,i=%d
    ",res,i); return 0; }

    5>論理式
    リレーショナル演算子:>>=<<=
    ==等しいかどうか(=代入)
          != 等しくないかどうか
    論理式の値は1(論理真,成立)または0(論理偽,不成立)である.しかし、C言語では、0以外は真であり、0は偽(変数、非論理式)である.
    論理演算子は、真と偽(論理演算)について使用できます.
          !ろんりひ
    &&論理も(そして)も真で、結果は真で、さもなくば偽
    論理も(あるいは)すべてうそで、結果はうそで、さもなくば本当です
    アルゴリズムの最適化を行い、短絡効果があります.論理和に対しては,前が偽であれば,後は演算を行わず,論理または,前が真であれば,後は演算を行わない.
    #include <stdio.h>
    /*
             
    */
    int main()
    {
        int i=0,j=0;
        if(i++&&j++){}//if(0&&j++) j++ 
        if(i--||j++){}//if(1||j++) j++ 
        printf("i=%d,j=%d
    ",i,j); return 0; }

    6>ビット演算子(標準のintとcharのみ)
    ビットと&バイナリビットで演算(2つの整数)を行う2つのビットはすべて1で、結果は1で、さもなくば0
    ビットまたは|バイナリビットによるまたは演算(2つの整数)両方のビットが0で、結果が0で、そうでない場合1
    ビット反転~バイナリビットによる反転演算(1個の整数)ビット反転、~3+1=-3->~3=-4
    ビットイソOR^バイナリビットによるイソOR演算(2個の整数)2個のビットが異なり、結果は1、そうでなければ結果は0
    注意:
    ビットと対応するバイナリビットを0にしてもよいし、対応する値を得ることもできる.ビットは111 0 111に0.
    ビットまたは対応するバイナリビットを1にしてもよいし、対応する値を得ることもできる.ビットまたは000 1 000セット1.
    ビットが異なるか、バイナリビットを反転できます.ビット異または000 1 000は反転できます.
    #include <stdio.h>
    int main()
    {
        int a=5,b=7;//0101  0111
        printf("a&b=%d
    ",a&b);//0101=5 printf("a|b=%d
    ",a|b);//0111=7 printf("a^b=%d
    ",a^b);//0010=2 printf("~a=%d
    ",~a);//-6 printf("b<<2=%d,b>>2=%d
    ",b<<2,b>>2);//11100=28,0001=1 b=b&0xFFFFFFFB;//111... 1011=11=B printf("b=%d
    ",b); printf("%d
    ",(b&0x00000004)!=0);// b 1 return 0; }

    7>左シフトと右シフト演算
    左シフト<<バイナリビットで左移動演算を行います.左シフト演算の場合、後ろの空席は0を補う
    右シフト>>バイナリビットで右移動演算を行います.右シフト演算の場合、前の空席の場合:符号数が符号ビットを補い、符号数が0を補いません.
    注意:左シフトは*2に相当し、右シフトは/2に相当するが、効率が高い.
    8>&/*演算子
    &アドレスを取る*アドレスに基づいて変数を取る
    printfの%pはアドレスを出力するために使用されます.
    アドレスはバイト番号で、アドレスを取って取得したのは変数の開始アドレスです.
    9>トリプル演算子
    (条件、論理値)?式1:式2----->条件が真の場合は式1、それ以外の場合は式2
    int a = 10;
    (a>10) ? 11 : 10 ; // a>10  11, 10
    (a>10) ?9.0: 8;  //  8.0,  。
     a>b ? a:b // a,b 

    3.タイプ変換
    1>浮動小数点と整数演算があり、自動的に浮動小数点に変換した後の演算;
    2>int(char、short)未満の整数演算は、自動的にint後演算に変換される.
    3>強制タイプ変換フォーマット:(ターゲットタイプ)()結果を格納するタイプ;
    強制タイプ変換演算子(ターゲットタイプ)は省略できます.char c = (char) int;