HQYJ嵌入式學習筆記——C語言複習day2

neko609發表於2021-02-21

1.計算機的數值表示

  • 數值型別和非數值型別

    1. 二進位制 0,1  (0b1001)
    2. 八進位制 0~7    (0146) 
    3. 十進位制 0~9
    4. 十六進位制 0~f  (0x3f)

    八進位制轉二進位制——>一位八進位制數換三位二進位制數。0124----->001 010 100

2.資料型別

    資料型別作用:決定變數在記憶體空間佔的記憶體大小

    記憶體的基本單位:位元組(byte)

    記憶體的最小單位:位元(bit)

        1 byte = 8 bit

 

  1. 基本資料型別:(32位系統OS)

 

    1. 整型家族
      • int (4 byte)
            unsigned int : 0 ~2^32 - 1
            [signed] int : -2^32 ~ 2^31 - 1
        short (2 byte)
            unsigned short : 0 ~ 2^16 - 1    0 ~ 65535
            [signed] short : -2^15 ~ 2^15 - 1    -32768 ~ 32767
        long (4 byte)
        long long (8 byte)
    2. 浮點型家族
      • float (4 byte)
            //有效數字 6 ~ 7位(四捨五入)    float f = 1.2345678921;
        double (8 byte)
            //有效數字 15 ~ 16位(四捨五入)
    3. 字元型(屬於整型家族,可以看成一個位元組的int)

      • char (1 byte)
            unsigned char : 0 ~ 255
            [signed] char : -128 ~ 127
  1. 構造資料型別 : 陣列 ,函式,結構體,共用體,列舉

  2. 指標

  3. void  空型別

    1. 通常在函式返回值還函式引數時候使用
    2. void *p;--------------->這個指標可以指向任意資料型別
    3. void num;  //error,非法定義型別,報錯

3.運算子

  1. 算數運算子

    + - * / %

  • int / int = int
    double / int ---隱式轉換成---> double / double = double
    隱式轉換:範圍小的往範圍大的轉
        char  short  -----> int
        float -----> double
        unsigned + signed ----> unsigned
    強制轉換
      格式 : (資料型別)變數名
             (資料型別) (表示式)(float)(a + b)
    % 要注意運算子兩邊只能是整型數

 

  1. 邏輯運算子

    • 邏輯表示式的結果只有兩個值真和假 非0表示真 0表示假

      &&
      表示式1 && 表示式2 : 只要有一個表示式結果為假,整個表示式的結果就為假
      只要表示式1的結果為假,所以表示式2不會再計算

      int a = 5, b = 6;
      int c = a++ > 5 && ++b > 6; //a=6 b=6 c=0

      ||
      表示式1 || 表示式2 : 只要有一個表示式結果為真,整個表示式的結果就為真
      只要表示式1的結果為真,那麼整個邏輯表示式的結果就為真,所以表示式2也不會再計算

      !
      int a = 0;
      if(a) //<====>if(a!=0) 表示式不成立 if(!a) 這個表示式成立
      {
      printf("*****\n");
      }

 

 

位運算子(int)

 

 

 

& : 按位與
12 & 23 = 0000 1100 & 0001 0111 = 0000 0100 4
| : 按位或
12 | 23 = 0000 1100 | 0001 0111 = 0001 1111 31
~ : 按位取反
~ 12
^ :按位異或 相同為0 不同為真
12 ^ 23 = 0000 1100 ^ 0001 0111 = 0001 1011 27

<< : 左移
12 << 3 0000 1100 << 3 = 0110 0000 = 96

>> : 右移
12 >> 3 1100 >> 3 = 0001 (高位補符號位)


清零

1011100111 //將第6位清零 & ~(1<<6)
& 0111111 ~(1 << 6) 1000000
------------------
1010100111

將某一位或者某幾位 置1

101111010011 //將第5位置1 |(1 << 5)
| 100000 (1 << 5)
---------------------
101111110011


1011000011
| 111000 (7 << 3)
---------------------
1011111011

 

 

關係運算子

> < >= <= == !=

賦值運算子

= += -= ++ --

++在前,先加1再取值;在後,先取值在加1

int a = 5; //a+=2; <===>a = a+2; &= |= ~=
int c = a++;
printf("%d,%d\n",a++,a); //5 6
printf("%d,%d\n",++a,a); //6 6

逗號運算子

計算規則:從左到右依次計算,取最後一個表示式的值作為逗號表示式的值
表示式1,表示式2,表示式3.....

int a = (12,14,16); // a = 16

條件運算子(三目運算子)

表示式1 ? 表示式2 : 表示式3
計算規則:先去判斷表示式1是否為真,如果為真就執行表示式2否則執行表示式3

int a = 5,b = 10,c = 8;

a > b ? a : b //10
a>b ? a : a>c ? a :c //8

sizeof() : 計算記憶體大小

格式:sizeof(變數名) sizeof(資料型別)
float f; sizeof(f) sizeof(float)

() [] & *

4、結構性語句

順序語句
printf()
scanf()
getchar() : 從鍵盤獲取一個字元

char ch = getchar();
printf("ch = %c,ch = %d\n",ch,ch);

putchar() : 向螢幕輸出一個字元

char ch = getchar();
putchar(ch);

gets() : 獲取字串
puts() : 輸出字串


選擇語句
迴圈語句

5、演算法

氣泡排序

選擇排序

6、定義變數

格式:

儲存型別修飾符 資料型別修飾符 資料型別 識別符號
儲存型別修飾符:
auto : 預設 , 一般修飾區域性變數,放在棧區
static : 靜態 , 會放在資料段
extern :外部宣告 , 1.c定義的全域性變數想要在2.c使用必須在2.c對這個變數做一個外部宣告
register : 暫存器型別,如果被register修飾會看當前有沒有可用暫存器,
如果有變數會被放在暫存器裡面,如果沒有,變數會自動轉為auto

資料型別修飾符:
const : 將變數變成只讀

識別符號的定義:(程式設計師自己取的名字 普通變數名 陣列名 指標名 函式名...)
(1)由數字 字母 下劃線組成,不能以數字開頭
(2)不能與關鍵字重名
(3)對大小寫敏感 見名知意

int a; <====> auto signed int a;

常量 : 在程式執行過程中不能被更改的量
整型常量
99
0xff
066
浮點型常量
12.5
1.2e+5 1.2*10^5
2.34e-4 2.34*10^-4 0.000234

字元型常量
ASCII碼錶 帶單引號才叫字元 a b 'a' 'b'
轉義字元 '\n' '\t' '\b' '\bbb' 1 ~ 3 '\xbb' '\123' '\x12' "\123456" "\12fa"
字串常量

7、輸入輸出函式

#include <stdio.h>
printf("格式控制串",輸出表); ------> 按照指定格式將資料輸出到螢幕上
輸出表:要輸出的資料 有多少個格式化符就有多少個要輸出的資料
格式控制串: 原樣輸出的內容+格式化符
格式化符:
%d -----> 有符號的十進位制數
%u------> 無符號的十進位制數
%o------> 八進位制數
%x------> 十六進位制數

%f -----> 浮點型
%g -----> 指數形式

%c-----> 字元
%s-----> 字串

%p -----> 地址

int a = 10000000;
printf("a=%d\n",a); a=10 //預設右對齊
printf("a=%5d\n",a); a=10000000 //由於指定的寬度5比資料的寬度要小,所以資料原樣輸出
prinrf("a=%10d\n",a); a= 10000000; //指定的寬度比資料寬度要大,用空格去補

int b = 0xaa;
printf("%d\n",b);
printf("%x\n",b); aa
printf("%#x\n",b); 0xaa //#是將進位制數的字首輸出

float f = 12.5;
printf("f=%f\n",f); f=12.500000 //編譯器預設小數輸出6位
printf("f=%.2f\n",f); f=12.50
printf("f=%7.2f\n",f); f= 12.50


scanf("格式控制串",地址表);------>按照指定形式從鍵盤獲取資料輸入到指定地址
&+變數名 : 變數的首地址
格式控制串: ""裡面除了格式化符,其他的內容原樣輸入

int a ;
scanf("%d",&a); 10
scanf("a=%d",&a); a=10

int a,b;
scanf("%d%d",&a,&b); 10 20
scanf("a=%d,b=%d",&a,&b); //在輸入的時候只能按照a=10,b=20的格式進行輸入
scanf("%d%d\n",&a,&b); //在輸入的時候要用非空字元去結束輸入

多個變數進行輸入,要用分隔符(空字元) 空格 回車 Tab


float num;
scanf("%.2f",&num); //error 小數在輸入的時候不能指定精度

char ch1,ch2;
scanf("%c%c",&ch1,&ch2); //如果用分隔符會將分隔符接收
scanf("%c%*c%c",&ch1,&ch2); //%*c會抑制掉一個字元
scanf("%c,%c",&ch1,&ch2); //指定格式輸入

8、記憶體儲存

整型數在記憶體裡面儲存的是補碼

正數的原碼 反碼 補碼都一樣
負數的補碼是反碼+1

有符號數最高位是符號位,正數符號位是0 負數符號位是1
反碼符號位不變,資料位改變

int a = 5;
0000 0000 0000 0000 0000 0000 0000 0101

int a = -5;
原碼:1000 0000 0000 0000 0000 0000 0000 0101
反碼:1111 1111 1111 1111 1111 1111 1111 1010
補碼:1111 1111 1111 1111 1111 1111 1111 1011
printf("%d\n",a);
printf("%u\n",a);

char ch = 130; //-128 ~ 127
printf("%d\n",ch); //-126

原碼: 1000 0010
1000 0010
1111 1101
1111 1110

0000 0000 0000 0000 0000 0000 1000 0010


char ch = -130;
printf("%d\n",ch); //126

原碼:1000 0010
反碼:0111 1101
補碼:0111 1110


1000 0000 0000 0000 0000 0000 1000 0010
1111 .... 0111 1101
1111 .... 0111 1110

9、選擇語句

 

 

 

 

 

 

相關文章