1. 程式人生 > >C語言關鍵字及運算符操作

C語言關鍵字及運算符操作

oat 分享 限定 改變 truct bce 基本 blog col

1、數據類型與變量的本質

數據類型 :數據類型可以理解為固定內存大小的別名,是創建變量的模子
變量本質 :變量是一段實際連續存儲空間的別名,程序中通過變量來申請並命名存儲空間,通過變量的名字可以使用存儲空間
技術分享圖片???技術分享圖片

2、關鍵字分析

2.1auto,static,register分析

C語言中的變量可以有自己的屬性,在定義變量的時候可以加上“屬性”關鍵字,“屬性”關鍵字指明變量的特有意義
?auto:C語言中局部變量的默認屬性,編譯器默認所有的局部變量都是auto的 (棧 )
?static:指明變量的“靜態”屬性,同時具有“作用域限定符”的意義(靜態區 )
??static修飾的局部變量存儲在程序靜態區

??static的另一個意義是文件作用域標示符
???―static修飾的全局變量作用域只是聲明的文件中
???―static修飾的函數作用域只是聲明的文件中
?register關鍵字指明將變量存儲於寄存器中,只是請求寄存器變量,但不一定請求成功(存儲於CPU寄存器中 )
?register變量的必須是CPU寄存器可以接受的值,不能用&運算符獲取register變量的地址
2.2if,switch,do,while,for分析
?分支語句分析 -- if
??if語句用於根據條件選擇執行語句,else不能獨立存在且總是與它最近的if相匹配;
??else語句後可以接連其他if語句
??零值比較的註意點: bool型變量應該直接出現於條件中,不要進行比較;
??普通變量和0值比較時,0值應該出現在比較符號左邊;float型變量不能直接進行0值比較,需要定義精度
技術分享圖片
 分支語句分析 -- switch
  switch對應單個條件多個分值的情形;每個case分支必須要有break,否則會導致分支重疊;
  default語句處理特殊情況
  case語句中的值只能是整型或字符型
  case語句排列順序分析:按字母或數字順序排列各語句; 正常情況放在前面,異常情況放在後面;default只用於處理真正的默認情況
技術分享圖片
 循環語句分析:
  循環語句的基本工作方式:
   通過條件表達式判定是否執行循環體;條件表達式遵循if語句表達式的原則
  do,while,for的區別:
   do語句先執行後判斷,循環體至少執行一次;while語句先判斷後執行,循環體可能不執行;
   for語句先判斷後執行,相比while更簡潔
  break和continue的區別:
   Break表示終止循環的執行;continue表示終止本次循環體,進入下次循環執行
2.3void,extern,sizeof分析
 void修飾函數返回值和參數:
  如果函數沒有返回值,那麽應該將其聲明為void型;如果函數沒有參數,應該聲明其參數為void;void修飾函數返回值和參數僅為了表示無
 void的意義:
  C語言沒有定義void究竟是多大內存的別名
  void指針的意義:
   C語言規定只有相同類型的指針才可以相互賦值;void*指針作為左值用於“接收”任意類型的指針;void*指針作為右值賦值給其它指針時需要強制類型轉換
技術分享圖片
 extern意義:
  extern用於聲明外部定義的變量和函數;
  extern用於“告訴”編譯器用C方式編譯 C++編譯器和一些變種C編譯器默認會按“自己”的方式編譯函數和變量,通過extern關鍵可以命令編譯器“以標準C方式進行編譯”
技術分享圖片
 sizeof:是編譯器的內置指示符,不是函數;用於“計算”相應實體所占的內存大小;sizeof的值在編譯期就已經確定!
2.4struct和union分析(存在字節對齊的問題)
struct中的每個域在內存中都獨立分配空間;union只分配最大域的空間,所有域共享這個空間
技術分享圖片
union的使用受系統大小端的影響 :
技術分享圖片
2.5enum和typedef分析
 enum是一種自定義類型;enum默認常量在前一個值的基礎上依次加1;enum類型的變量只能取定義時的離散值
 枚舉類型和#define的區別:
  #define宏常量只是簡單的進行值替換,枚舉常量是真正意義上的常量
  #define宏常量無法被調試,枚舉常量可以
  #define宏常量無類型信息,枚舉常量是一種特定類型的常量
技術分享圖片
 typedef分析:
  typedef給已經存在的數據類型重命名;沒有產生新的類型;
  typedef重定義的類型不能進行unsigned和signed擴展
 typedef和#define的區別:
  typedef是給已有類型取別名;#define為簡單的字符串替換,無別名的概念
技術分享圖片
2.6const和volatile分析
 const修飾變量:
  const修飾的變量是只讀的,其本質還是變量;
  const修飾的變量會在內存占用空間 ,本質上const只對編譯器有用,在運行時無用
 const修飾數組:const修飾的數組是只讀的;const修飾的數組空間不可被改變 (元素值不可修改)
技術分享圖片
 const修飾指針:(左數右指)當const出現在*號左邊時指針指向的數據為常量,當const出現在*後右邊時指針本身為常量

            const int* p;              //p可變,p指向的內容不可變
            int const *p;              //p可變,p指向的內容不可變
            int* const p;              //p不可變,p指向的內容可變
            const int* const p;    //p不可變,p指向的內容不可變

 const修飾函數參數和返回值:
  const修飾函數參數表示在函數體內不希望改變參數的值
  const修飾函數返回值表示返回值不可改變,多用於返回指針的情形
技術分享圖片
 volatile:告知編譯器編譯方法的關鍵字,不優化編譯
  volatile可理解為“編譯器警告指示字”;
  volatile用於告訴編譯器必須每次去內存中取變量值
  volatile主要修飾可能被多個線程訪問的變量;
  volatile也可以修飾可能被未知因數更改的變量
技術分享圖片

C語言關鍵字及運算符操作