程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C語言學習總結,c語言學習

C語言學習總結,c語言學習

編輯:關於C語言

C語言學習總結,c語言學習


一、c語言的基本概念

                                                                      丹尼斯 裡奇

1 是一個面向過程的計算機高級語言--不需要任何運行環境便能運行的程序語言;

2 標准:目前是C11      (K&R C—>ANSI C / C89標准—>C99標准——>C11標准)

 

 

二、C程序概念

1、C程序結構:有很多的函數構成,main函數為主函數-程序執行入口;

 

2、C語言執行過程:程序編寫出來通過編譯器編譯連接後生成機器語言,計算機才可以執行。 目前用的Clang編譯器是作者: 克裡斯·拉特納(英語:Chris Lattner,1978年)

C語言知識點

注釋            關鍵字           標識符

數據類型      常量              變量

基本運算      流程控制        函數進制

內存分析      數組              字符串

指針            變量類型        結構體

枚舉            預處理指令     宏定義

條件編譯      typedef        文件操作

 

三、基本語法總結:

一、 注釋----對代碼進行解釋說明,輔助調試代碼,不參加編譯

用法:

1.單行注釋 //想注釋的內容 

2.多行注釋:  /*想注釋的內容*/

 

二、標示符--自定義的一些名字

用法:

1.由26個英文字母的大小寫、10個阿拉伯數字0~9、下劃線_,$組成;

注意:

  • 1.不能以數字開頭
  • 2不能與關鍵字重名
  • 3.嚴格區分大小寫
  • 4.起名要有意義
  • 5.便於識別(駝峰命名).

三、數據類型

 

四、常量--是一些固定的數據 

有四大類:整型(int)    浮點型(單精度(float)和雙精度(double))    字符型char   字符串型

特點:  數據不會被改變

 

五、變量--表示一個需要經常改變或者不確定的數據

變量類型 變量名; 如:int num;

1.賦值 num=1; 2.修改 num=2;

特點:

  • 1.創建一個變量相當於在內存中占用了一塊空間
  • 2.這個空間的大小是固定的,但裡面的數據可以改變
  • 3.同一個作用域內不能有相同的變量名.
  • 4.初始化時創建,在函數作用域執行完後失效,且內存空間釋放.

全局變量

一,是什麼?

在所有函數外部定義的變量,稱為全局變量。

二,有什麼用?

用於存儲一個需要長期存於內存,並需要改變的變量.

三,怎麼用?

 跟普通變量沒區別,只在位置在在所有函數之外.

四,什麼時候用? 

當需要定義一個隨程序一直存於內存中,並可以被其它函數共享的變量時候.

五,有什麼特點?

 1.生命生期跟隨程序.程序啟動創建,程序退出其才會銷毀

 2.作用域是其所在位置之下的所有函數,都可以共享並改變.

 3.變量的使用遵循就近原則如果函數內有同名變量,那麼用函數自已的.

 4.如果沒有初始化賦值,默認值是0;

 

printf()函數--輸出

常用格式化字符串:%d 整數    %f 浮點數  %c 單個字符  %s字符串   %p 指針的值

定義:printf(“<格式化字符串>”, <參量表>);如printf("a=%d\n",123);

scanf()函數--輸入

定義:scanf (“格式化字符串”, 變量地址);如 int a;int b;  scanf(“%d,%d",&a,&b);

六、轉義字符

七、關鍵字 32個

auto       double     int          struct 

break     else         long        switch  

case       enum      register   typedef

char       extern     return     union

const      float        short      for 

signed    void         if            unsigned

default    goto        sizeof     volatil  e

do          continue   while      static

 

typedef

 

一,是什麼?

是一個C語言的一個關鍵字.

 二,有什麼用?

可以給一個數據類型取一個別名,方便使用.

三,怎麼用?

定義: typedef  類型 別名;

 如:   typedef  long int  Lint; 表示給一個long int 類型取一個別名為Lint

則:   long int a =5;與Lint  a=5;二者等效

四,什麼時候用? 

當希望給一個類型取一個別名時(類型比較復雜等),可以用,方便理解調用.

五,有什麼特點?

1.定義位置沒有限制,函數內外都可以.

2.作用域為定義位置開始至所處作用域結束.類似於變量

3.可以用於任意數據類型.

4.別名具有數據類型的含義,這是跟宏定義最大區別.

 

static與extern

 

一,是什麼?

是C語言的關鍵字.

 

二,有什麼用?

控制一個變量或函數的作用域.

 

三,怎麼用?

修飾函數:static 返回值 函數名(){};表示函數為內部函數只能被本文件訪問.

extern 返回值 函數名(){};表示函數為外部部函數能被程序的所有文件訪問.(默認)

修飾全局變量: static:表示變量只能被當前文件訪問. extern:所有文件共享.(默認)

修飾局部變量: static:表示延長變量生命周期至程序結束. extern:聲名一個全局變量.

 

四,有什麼特點?

1.外部函數不同文件中也不能重名,但內部函數可以

2.同類型全局變量可以重復定義,但在內存中只有一份.

3.可以在函數內聲名一個全局變量.但要使用必須在函數外定義. extern只是聲名.

4.static修飾定義局部變量,則這個局部變量生命周期延長至程序結束.但作用域不變.

 

auto與const

一, 是什麼?

是C語言的關鍵字.

 

二,有什麼用?

auto: 用於定義一個能自動回收的臨時變量.這個變量在作用域內用完後會自動銷毀.

canst:用於定義一個常量,這個常量在常量區,且在內存中僅有一份.且不能改變.

 

三,怎麼用?

auto  數據類型 變量名;(默認所有局部變量都是被這個修飾,可以省略)

注意: 1. static修飾的除外.  2.全局變量除外;

 

canst 數據類型 變量名=值;

注意:一但定義,值就固定不能被改變.

如:

  const  int a;

 

goto

一, 是什麼?

是C語言的關鍵字.

 

二,有什麼用?

讓指令能夠不受條件跨越執行.簡化代碼

 

三,怎麼用?

int a=0;

if(a==0){

      goto heima;

}

printf(“itcast\n”);//這行不會執行

heima:printf("heima\n");//直接跳到這裡執行

 

三,什麼時候用?

需要不受限制進行指令跳轉時.(如:跳出多層循環嵌套)

 

register與volatile 

一, 是什麼?

是C語言的關鍵字.

 

二,有什麼用?

register 表示讓程序優先把這個數據存在寄存器中.

volatile 表示讓編譯器不要去優化代碼,不能用緩存,每次使用都必須去內存中獲取.

 

三,怎麼用?

修飾變量:

  register  數據類型 變量名;

  volatile   數據類型 變量名;

 

四,什麼時候用?

register :如果一個變量使用相當頻繁且占用內存又不是很大.可以使用.

  全局變量與加了static局部變量除外.

volatile : 如果需要讓計算機嚴格按寫的指令指執行,且能關注變量每一次值的變化,

  這個時候可以使用,則編譯器不會對執行指令作優化.

 

 

數組

一,是什麼?

是用來存儲一組數據的容器.

二,有什麼用?

用於把同一類型的一組數據統一管理起來.

三,怎麼用?

定義: 數據類型 數組名[長度(數量)] ;初始化:類型 數組名[(長度)]:={元素1,元素2,…}

賦值:數組名[角標(索引)]=值;   使用:數組名[角標];如int a=arr[0];

四,什麼時候用? 

當需要管理一組有關聯的數據時.

五,有什麼特點?

  • 1.數組必須要定義長度(正整數),定義時可初始化(長度必須是常量)或之後單獨初始化.
  • 2.數組是有序的.每個數據都有角標.從0開始分配.角標不能>=數組長度.類型一致.
  • 3.數組有地址(數組名),裡面的元素也有地址.數組當參數時(長度可省)傳遞的是地址.
  • 4.數組當參數傳遞時是指針類型.所以如果需要用數組長度要額外傳遞.

二位數組

一,是什麼?

是用來存儲一組數組的容器.

二,有什麼用?

用於把同一類型的一組數組統一管理起來.

三,怎麼用?

定義:  類型 數組名[數組的數量][子數組的長度] ;

初始化:類型 數組名[數組的數量][子數組的長度] :={{數組1}, {數組2},…}

賦值:   數組名[數組角標][子數組中數據角標]=值;

使用:   數組名[數組角標][子數組中數據角標];如int a=arr[0][1];

 四,什麼時候用? 

當需要管理一組有關聯的數組時.

五,有什麼特點?

1.與數組基本一樣.但傳遞子數組時傳遞的是地址.

2.子數組數量控制行數,單個子數組長度控制列數.

3.每個子數組類型及長度一致.

 

字符串

一,是什麼?

是一串字符,也是一個以’\0’結尾的字符數組.

二,有什麼用?

用於表示一串字符或文本數據.

三,怎麼用?

定義及初始化:  char arr[]=“abc”;或char arr[4]={‘a’,’b’,’c’,’\0’}

輸出:printf(“%s\n”,s);或printf(“%s\n”,&arr[0]);  賦值:strcpy(字符變量名,“字符串");

四,什麼時候用? 

當需要表示一串字符或文本的時候.

五,有什麼特點?

1.後面必須有’\0’結尾.否則只算普通的字符數組.但’\0’不會輸出,只表示字符串結束.

2.字符串輸出占位用%s必須遇到\0.才能結束,否則會繼續輸出更高位地址值的字符.

3.strlen函數用於計算一個字符串的長度(字符數量),使用必須引入<string.h>.

4. strlen不會計算\0.且碰到\0結束,但是sizeof不受\0影響,且長度會包含\0.

5.字符串一定是字符數組,但字符數組不一定是字符串.

 

指針

一,是什麼?

嚴格上來講,指針具有兩層含義:一是指一種數據類型.二是指一種保存地址的變量. 二,有什麼用?

用於存儲某一個地址,從而可以通過地址直接對該地址內存空間中的數據進行操作.

三,怎麼用?

定義:  類型 *指針名;如:int *p;表示定義一個能存int類型地址的指針變量, 名字叫p.

賦值:  指針變量名=指針(地址).注意:指針獲取方法(&變量名).

四,什麼時候用? 

當需要存儲地址,以便於操作該地址及地址對應的內存數據的時候.

五,有什麼特點?(注:以下的p表示一個指針變量名)

  • 1.指針本身也有地址.指針定義之後,自身地址不變,但裡面的存的地址可以變化.
  • 2. &p表示指針自身地址,而p表示指針存的地址 *p表示指針所存地址的內存空間.
  • 3.指針不初始化賦值不要使用.未賦值前地址是隨機的.未賦值不可以用*p.
  • 4.*修飾什麼,就表示是什麼的指針.判斷原則:先確定變量的類型.(根據符號優先級)
  • 5.指針是什麼類型的,就應該存什麼類型的地址.否則*p取對應內存空間的值會出錯.

 

指針與數組

一,什麼是指針數組?

表示一個數組,用來存指針的數組就叫指針數組.數組裡面的元素都是指針.

如:int *p[3];表示定義一個可以存三個int指針的數組.

賦值: int a1=1,a2=2,a3=3;  int *p[3]={&a1,&a2,&a3};   取值: int *a=p[0];

二.什麼是數組的指針?

表示一個指針,而這個指針類型是數組.

如:int (*p)[3];表示這是一個含有三個元素的int數組的指針.

賦值:int arr[3]={1,2,3}; int (*p)[3]=&arr;

三.什麼是數組元素的指針?

表示一個指針,而這個指針存的是數組一個元素的地址. int arr[1]={1}; int *p=&arr[0];

三,有什麼特點?

1.數組名表示第一個元素的地址,&數組名表示整個數組的地址.二者值相同,但意義不同.

 2.指針可以運算.但僅限於加減運算.運算的實質就是地址運算.即地址的移動.

3.地址(+1)向高位移動,而(-1)向低位移動.不同指針類型移動一位(+1或-1)的字節數不同.

4.實際移動的字節數看指針類型,類型占多少個字節,一位就移動多少個字節.

 

指針與字符串

 

一,怎麼表示一個字符串?

char arr[] = ”likui";

 

二,怎麼用指針表示一個字符串?

char *p = "likui”;

 

三,怎麼表示一個字符串數組?

char arrs[2][8] = {”likui“, ”yingying“};

 

四.怎麼用指針表示一個字符串數組?

char *arrs[2] = {”likui", ”yingying”};

 

五,有什麼特點?

1.指針定義的字符串是常量,不能被改變.而字符數組定義的是變量.可以被改變.

2.指針定義一個字符串,指針存的實際是在常量區的那個字符串的首字符的地址

 

指針與函數

一,什麼是指針型函數?

是函數. 這個函數的返回值類型是指針;

定義:類型 * 函數名(參數){return 指針類型;}

如:int  *add(int *a){return &a;}.表示定義一個返回值是int指針類型的add函數.

 

二,什麼是函數指針?

是指針.函數也會在內存開辟一塊空間.函數指針即這塊空間的地址.

定義:函數返回值類型 (*指針名)(參數類型);賦值:指針名=函數名;

如:先定義函數int add(int a){ //...}. int (*p)(int)=add;

使用:指針名(實參); 如:p(3);等效於add(3);

 

三,有什麼特點?

1.函數指針做加減運算可以,但沒有意義.不建議.

2.函數指針可以當作參數傳遞.因為其是一個指針類型.

3.不管什麼類型的指針,只要是指針,其裡面存的就是地址.

 

結構體

一,是什麼?

是一種數據類型.是構造類型.裡面可以存不同類型的數據.

二,有什麼用?

用於封裝不同的數據類型到一個結構中.方便使用.

三,怎麼用?

定義:1.定義結構體類型 struct 結構體類型{數據類型1 名稱;數據類型2 名稱;…};

       2.定義結構體變量及賦值: struct 結構體類型 變量名={數據1,數據2….};

取值:變量名.結構體元素變量名;  賦值:變量名.結構體元素變量名=新值;

四,什麼時候用? 

當需要把相關聯的不同數據類型封裝起來一起使用的時候.

五,有什麼特點?

1.可在定義結構體類型時同時定義結構體變量名,可定義匿名類型結構體;

2. 同一作用域內不可重復定義結構體類型和結構變量.匿名類型結構體除外;

3.可在函數內也可在函數外,效果及用法類似於局部變量和全局變量.也可嵌套定義.

4.可同時在函數內外定義同一個類型,使用同樣遵循就近原則,結構體變量也是如此.

 

結構體數組 

一,是什麼?

是數組,只不是數組裡每一個元素是結構體類型。

二,有什麼用?

用於存儲多個有關聯的結構體.

三,怎麼用?

 定義及初始化賦值:  struct 結構體類型 數組名[長度]={結構體1,結構體2};

如:  struct Person{char *name;int age;};

      struct Person per={”itheima",2};  struct Person per1={”itcast",3};

      struct Person arr[2]={per,per1};

取值:數組名[角標];單獨賦值:數組名[角標]=新的結構體;

如:  struct Person per3=arr[0];

四,什麼時候用? 

當需要存儲多個有關聯的結構體,並作為一個整體使用時.

五,有什麼特點?

 1.遵循數組的特點

 

結構體的指針

一,是什麼?

是指針,只不是指針類型是結構體類型。

二,有什麼用?

用於存儲結構體的地址,並操作地址對應的結構體空間裡的數據.

三,怎麼用?

 定義及初始化賦值: struct 結構體類型 *指針名=&結構體變量

如:  struct Person{char *name;int age;};    struct Person per={”itheima",2}; 

  struct Person *p=&per;

取值: (*指針名).結構體元素名;  指針名->結構體元素名; (結構體獨有的用法)

賦值: (*指針名).結構體元素名=新值;  指針名->結構體元素名=新值

如:  (*p).name,(*p).age;或p->name,p->age;

四,什麼時候用? 

當需要使用指針操作結構體時.

五,有什麼特點?

 1.指針移動對結構體本身沒有意義.結構體名並不包含第一個元素的地址.

 

枚舉--不常用

一,是什麼?

是一種數據類型.稱為枚舉類型.是構造類型的一種,裡面存的都是有別名的整型常量.

二,有什麼用?

可以把多個整型常量以別名的形式封裝成一個整體,便於別的變量識別並取值使用.

三,怎麼用?

定義:1.定義枚舉類型 enum 枚舉類型{元素1 , 元素1 , …}; 或{元素1=0,元素2=1,}

       2.定義枚舉變量及賦值: enum 枚舉類型 變量名=對應枚舉裡的一個元素名;

取值:變量名=枚舉元素名;    

四,什麼時候用? 

當一個變量只有固定的多個int取值范圍時.

五,有什麼特點?

1.枚舉類型只能是int值,且不能直接用int常量,需要用別名(建議全部大寫)

2.如果不設定值,那麼默認第一個元素是0,以此類推;

3.同一個作用域內不能出現重復的元素.不同的枚舉類型也不行.

 

函數

一個C程序的片段,對一個功能進行封裝,簡化代碼,提高復用性

定義:

 

返回值類型 函數名(形式參數類型 參數名1,……){ 具體代碼 return 返回值}

調用:

函數名(實際參數1,實際參數2,…..); 

聲明:

 

把函數去掉{}拷貝到聲明區域(函數裡或外)就可以了.返回值 函數名(形式參數1,….) 

 

注意:

  • 1.返回值類型不定義默認是int.如果不需要具體返回值類型用void(return可以省略).
  • 2.是否要定義參數看是否有未知內容參與運算,調用時參數必須對應.參數傳遞的是值. 

 

頭文件

一,是什麼?

是C語言中以.h結尾的文件,如stdio.h .

二,有什麼用?

用於聲名(描述)一個函數,把多個代碼文件(如a.c;b.c;…)中的函數,聲明在這個文件中,以便於重用 、防止定義的沖突.

三,怎麼用?

定義:   新建一個以.h結尾的文件,把需要用到的函數的聲名直接放在裡面.

引用:   自定義的頭文件:#include  “頭文件名.h”

     編譯器類庫裡的頭文件:#include  <頭文件名.h>

四,什麼時候用? 

當程序需要由多個c文件組成時.

五,有什麼特點?

1.在頭文件中僅做聲名,不做具體實現

 2.在頭文件有聲名只能確保編譯成功成.o文件;但不確保能鏈接成功.

3.自定義的頭文件引用時必須要有路徑.

 

#include的使用

一,是什麼?

是C語言中的一個預處理指令.

二,有什麼用?

用於把一個文件的內容拷貝到這行命令所在的位置.

三,怎麼用?

引用:  自定義的文件:#include  “文件路徑和名稱”

     編譯器類庫裡的文件:#include  <文件名>

四,什麼時候用? 

當程序需要用到別的文件時.

 

進制及內存分析

 

二進制--計算機語言

十進制--日常用的

 

代碼表示: 二進制:0b或者0B開頭 八進制:0開頭 十進制:直接寫 十六進制:0x或0X開頭(最大F)

2.進制的打印輸出:

%o:表示輸出不帶符號八進制整數

%x:表示輸出不帶符號十六進制整數

%d:表示輸出有符號十進制整數

%u:表示輸出不帶符號十進制整數

注意:

  • 二進制不可以直接輸出.
  • 有符號與無符號區別:有符號可以有負數表現(如: - 2)

 

進制互換 

1.二進與十進制互轉:

 

 2.二進制與八進制互轉:

每3個2進制表示一個8進制:因為0b111==07  (8進制每位最大是7)

3.二進制與十六進制互轉:

每4個2進制表示一個16進制:因為à0b1111==0xF (16進制最大是F)

注意:

  • 二進制是各進制轉換的中間橋梁

10進制à2進制--->8進制或16進制       8進制--->2進制----->10進制或16進制

 

數據取值范圍

一.基本數據類型取值范圍---超出取值范圍數據會定義失敗.

 

位運算

一,是什麼?

是直接對整數在內存中的二進制位進行操作的方法(只能操作整形數據)

二,有什麼用?

直接通過操作二進制的位來實現運算,高效

 三,怎麼用?

&與運算:對應兩個二進位均為1時,結果位才為1,否則為0。(有假為假==0)

| 或運算:對應的兩個二進位有一個為1時,結果位就為1,否則為0。(有真為真==1)

^ 異或運算:對應的二進位不同時為1,否則為0。(不同為真==1,相同為假==0)

注意:1.相同整數相^的結果是0.2.一個數^另一數兩次結果不變3.整數相^跟順序無關

~ 取反運算:對整數的各二進位進行取反,包括符號位(0變1,1變0,真假互換)

<< 左移:把整數的各二進位全部左移n位,高位丟棄(包括符號位),低位補0。

左移n位其實就是乘以2的n次方(但移動後符號位變化除外,符號位改變則正負改變) 

>> 右移:把整數的各二進位全部右移n位,符號位不變。高位的空缺是正數補0;

是負數高位是補0或是補1 取決於編譯系統的規定;右移n位其實就是除以2的n次方

 

 

     

四、基本運算

1.算術運算

“ + ”加法運算符  “ - ”減法運算符  “ * ” 乘法運算符  “ / ”除法運算符  “ % ” 取余運算符.

  • 1.不同數據類型精度不一樣.double>float>int.  取余運算符只能整數.+1:正數 -1:負數
  • 2.若用高精度向低精度變量賦值.會丟失精度.如:int a=1.8;那麼a值是1.(非四捨五入)
  • 3.運算優先級是.從左到右 但: * = / = % > + = -  如果要人為改變則加().
  • 4.運算時兩個數據精度不一樣,會自動類型轉換,且是低精度向高精度轉換.
  • 5.同精度運算只能得到同精度的結果.如果需要提高精度,需要強制類型轉換.

 

2.賦值運算

“ = ”賦值運算符  “ += ”加等於運算符  “ -= ”減等於運算符  

“ ++ ” 自增運算符  “ - - ”自減運算符

  • 1.變量才能自我變化,如自增或自減,但常量不能.
  • 2. ++a,與a++,對a本身沒有區別,但是參與其它運算時,a++這個整體的值沒有變化.

3.關系運算

“ == ”    “ > ”    “ < ”   “ >= ”    “ <= ”     “!=”

用法:對數據進行比較,看是否成立,條件成立=真(1),條件不成立=假(0).

  • 1.關系運算符運算結果是一個int值.0或1.
  • 2.優先級:>,<,>=,<=,優先級相等, 但大於==和!=.同時==與!=優先級相等.
  • 3.如果優先級相同的兩個運算,先後順序看結合律(結合律指要麼從左往右運算,要麼從右往左運算),關系運算符結合律是從左往右,即:先看優先級,再看結合律.如下:

    int b=1!=2>3<4; 等效於:2>3為假=0. 0<4為真=1, 1!=1為假=0.所以最終結果=0;

4.邏輯運算

“ ||”或     “ && ”與     “ ! ”非

用法:對於多個表達式進行並列真假判斷

注意:

  • 1.所有數據都有真假值.0為假,其它的數都為真(規定).   結合律:從左往右執行,
  • 2. 如果||表達式左邊表達式已經為真,則右邊不執行.而&&只要左邊為假右邊不執行.
  • 3.優先級順序為:小括號() > 負號( -) > ! > 算術運算符 > 關系運算符 > && > ||

5.三目運算符--(一般不用)

定義:

<真假判斷表達式1>?<表達式2>:<表達式3>;

如: 1+2>4?2+2:3+4; 這個運算過程為:

 1+2=3, 3>4為假.則運行3+4這個表達式.所以最終結果為7.

 

 

 

流程控制

1.選擇語句

是指編程中用來判定所給定的條件是否滿足,根據判定的結果(真或假)決定執行給出的兩種操作其中的一個

if語句用法:

1.if(){}  2.if(){}else{}  3. if(){}else if(){}     4.if(){}else if(){}else{}   5.if() ;

注意:

  • 1.一次if語句只能執行給出的所有操作中的一個.
  • 2.if();這種用法時if語句只有緊跟後面一句有效.(讀到下一個;號結束).且不能定義變量
  • 3.除了if();這種用法,所有的if()與{}之間不能有;號
  • 4.if(條件判斷){},裡面的條件判斷如果是與常量的等於判斷,則常量寫在前面(建議);

 

swich語句用法:--一般用於判斷值是整數用

switch(表達式){ case 常量表達式1: 語句1;break;… case…;default:  語句n;}

注意:

  • 1.條件結果只能是整數,而case只能是整型常量.注意:case ‘a’;
  • 2.break 可有可無,有則執行完跳出,沒有則繼續執行,直到遇到下一個break或執行完.
  • 3.default可有可無,有則如果條件都不滿足,會執行這句,無則條件都不滿足,執行結束.
  • 4.case下面要定義變量必須加{}.且case後的常量值不能重復
  • 5.switch語句可以全部用if語句替代.但if語句不能全用switch替代.

 

2.循環語句

是指編程循環語句,當滿足條件時進入循環,循環判斷,直到不滿足條件跳出循環

根據條件反復執行一段代碼的時候用

while語句用法:

while(<條件>) {<語句>};          do {<語句>} while(<條件>); 

 

for語句用法:

for( ; ; ){ }裡面是3個語句,兩個分號。

第一個語句是開始前執行,

第二個語句是判斷真假,如果真,就執行後面(大括號內)的代碼。

第三個語句是每次執行完畢後執行 

注意:

  • 1.如果碰到continue,則跳出本次循環繼續下一次判斷,如果條件成立繼續執行循環.
  • 2.如果碰到break無論條件滿足與否,循環立刻結束.
  • 3.continue與break跳出的都是當前所在的循環作用域.如果外層有循環,不受影響.
  • 4.do while至少執行一次.而while不一定.

 

 

預處理指令

1.宏定義

一,是什麼?

是一個替換代碼的預處理指令

二,有什麼用?

可以在編譯之前進行代碼替換.

三,怎麼用?

開始替換: #define 被替換內容  替換成的內容

如: #define kLength 6 表示從這行開始下面所有代碼中的kLength 替換成6

結束替換: #undef 被替換內容 如: #undef  kLength   表示到一行, 宏定義失效

四,什麼時候用? 

當需要用一些重復性代碼或簡單的函數運算時,可以用宏定義.提高效率

五,有什麼特點?

1.命名盡量以大寫或小寫k開頭.便於區分.(規范)

2.被雙引號的引起來的不會被替換

3.宏定義只會做代碼替換,不會關注任何邏輯,容易出現優先級錯誤(加括號解決).

4.替換可以設置作用域.如果不設置,作用域則是這行代碼出現到代碼的最後一行.

 

2.條件編譯

一,是什麼?

是一個根據條件編譯代碼的預處理指令

二,有什麼用?

可以讓一段代碼只在滿足條件才編譯.提高編譯效率

三,怎麼用?

通用:  #if 條件表達式  #elif 條件表達式   #else

與宏定義相關:  #ifdef 宏名 表示定義了宏  #ifndef 宏名 表示沒有定義宏

#endif 結束條件編譯.注意一定要加.

四,什麼時候用? 

當一些代碼只需要在一定條件下編譯時.

五,有什麼特點?

1.條件編譯不能訪問需要編譯後才能執行的代碼.

2.條件編譯不需要用大括號,所以必須加上結束標識,否則涵蓋下面的所有代碼

3.條件編譯一般跟宏定義配合使用,防止重復包含及交叉包含

 

文件操作

一,是什麼?

是對文件或文件內容的輸入(讀)與輸出(寫). 文件操作的函數在<stdio.h>中聲名.

二,怎麼用?

1.打開一個文件並確定操作的方式:fopen(“文件”,”打開方式”);

函數會返回一個文件的指針(即結構體的指針).FILE *

2.開始操作:讀或寫. 常用的文件讀寫函數有三類:

字符讀寫函數:char c=fgetc(文件指針)讀和fputc(字符,文件指針)寫 ;

字符串讀寫函數:fgets(字符緩存,數量,文件指針)讀和fputs(字符緩存,文件指針)寫;

數據塊(二進制)讀寫函數:fread(數據容器,單個數據字節數,總數,文件指針)讀

          fwrite(數據容器,單個數據字節數,總數,文件指針)寫;

3.操作完成,關閉文件:fclose(文件的指針)

三,有什麼特點?

1.打開文件的模式限定操作的方式.

2.打開操作文件後一定要關閉文件,否則容易引起內存洩漏.

3.輸入與輸出是相對於操作者而言.

 

  

 

 

 

 

 

 

 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved