?do,while,for 的區別
? do 語句先執行後判斷 , 循環體至少執行一次
? while 語句先判斷後執行 , 循環體可能不執行
? for 語句先判斷後執行 , 相比while 更簡潔
?break 和continue 的區別
? break 表示終止循環的執行
? continue 表示終止本次循環體 , 進入下次循環執行
注意:swicth語句不能與continue同時用
遭人遺棄的 goto
? 高手潛規則 : 禁用goto
? 項目經驗 : 程序質量與goto 的出現次數成反比
? 最後的判決 : 將goto 打入冷宮
void 的意義
? void 修飾函數返回值和參數
? 如果函數沒有返回值 , 那麼應該將其聲明為void 型
? 如果函數沒有參數 , 應該聲明其參數為void
void 修飾函數返回值和參數僅為了表示 無
不存在void 變量
C 語言沒有定義void 究竟是多大內存的別名
沒有void 的標尺
無法在內存中裁剪出void 對應的變量
? void 指針的意義
? C 語言規定只有相同類型的指針才可以相互賦值
? void* 指針作為左值用於“ 接收” 任意類型的指針
? void* 指針作為右值賦值給其它指針時需要強制類型轉換
extern 中隱藏的意義
? extern 用於聲明外部定義的變量和函數
? extern 用於“ 告訴” 編譯器用C 方式編譯
C++ 編譯器和一些變種C 編譯器默認會按“ 自己” 的方式編譯
函數和變量 , 通過extern 關鍵可以命令編譯器“ 以標准C 方
式進行編譯” 。
為sizeof 正名
? sizeof 是編譯器的內置指示符 , 不是函數
? sizeof 用於“ 計算” 相應實體所占的內存大小
? sizeof 的值在編譯期就已經確定
? const 修飾函數返回值表示返回值不可改變 , 多用於返回指針的情況
深藏不漏的volatile
? volatile 可理解為“ 編譯器警告指示字”
? volatile 用於告訴編譯器必須每次去內存中取變量值
? volatile 主要修飾可能被多個線程訪問的變量
? volatile 也可以修飾可能被未知因數更改的變量
由結構體產生柔性數組
? 柔性數組即數組大小待定的數組
? C 語言中結構體的最後一個元素可以是大小未知的數組
? C 語言中可以由結構體產生柔性數組
union 和struct 的區別
? struct 中的每個域在內存中都獨立分配空間
? union 只分配最大域的空間 , 所有域共享這個空間
union 使用的注意事項
? union 的使用受系統大小端的影響
枚舉類型的使用方法
? enum 是一種自定義類型
? enum 默認常量在前一個值的基礎上依次加1
? enum 類型的變量只能取定義時的離散值
枚舉類型和#define 的區別
?#define 宏常量只是簡單的進行值替換 , 枚舉常
量是真正意義上的常量
?#define 宏常量無法被調試 , 枚舉常量可以
?#define 宏常量無類型信息 , 枚舉常量是一種特
定類型的常量
面試中……
考官 : 你能說說typedef 具體的意義嗎 ?
應聘者 :typedef 用於定義一種新的類型 。。。
? typedef 用於給一個已經存在的數據類型重命名
? typedef 並沒有產生新的類型
? typedef 重定義的類型不能進行unsigned 和signed 擴展
typedef 和#define 的區別
? typedef 是給已有類型取別名
? #define 為簡單的字符串替換 , 無別名的概念
注釋符號
? 注釋規則小結
? 編譯器會在編譯過程刪除注釋 , 但不是簡單的刪除而是用空
格代替
? 編譯器認為雙引號括起來內容都是字符串 , 雙斜槓也不例外
? “/*……*/” 型注釋不能被嵌套
注釋符號
? 你覺得Y=x/*p 是什麼意思? ?
作者本意 : 把 x 除以*p 的結果賦值給 y
編譯器 : 將/* 作為一段注釋的開始 , 把 /* 後的內
容都當成注釋內容 , 直到*/ 出現為止
在編譯器看來 , 注釋和其它程序元素都是平等的 , 所以 ,
作為程序員也不能看輕注釋 。
? 出色的注釋你來寫
? 注釋應該准確易懂 , 防止二義性 , 錯誤的注釋有害而無利
? 注釋是對代碼的提示 , 避免臃腫和喧賓奪主
? 一目了然的代碼避免加注釋
? 不要用縮寫來注釋代碼 , 這樣可能會產生誤解
? 注釋用於闡述原因而不是用於描述程序的運行過程
? C 語言中的接續符(\) 是指示編譯器行為的利器
? 接續符的使用 :
? 編譯器會將反斜槓剔除 , 跟在反斜槓後面的字符自動解到前
一行
? 在接續單詞時 , 反斜槓之後不能有空格 , 反斜槓的下一行之
前也不能有空格
? 接續符適合在定義宏代碼塊時使用
? C 語言中的轉義符(\) 主要用於表示無回顯字符 , 也可
用於表示常規字符
小結
? C 語言中的反斜槓(\) 同時具有接續符和轉義符的作用
? 當反斜槓作為接續符使用時可直接出現在程序中
? 當反斜槓作為轉義符使用時需出現在字符或字符串中
? C 語言隱式類型轉換
? 算術運算式中 , 低類型轉換為高類型
? 賦值表達式中 , 表達式的值轉換為左邊變量的類型
? 函數調用時 , 實參轉換為形參的類型
? 函數返回值 ,return 表達式轉換為返回值類型
int -> unsigned int -> long -> unsigned long -> double
float
char
short
? #if…#else…#endif 被預編譯器處理 ; 而if…else 語句被
編譯器處理 , 必然被編譯進目標代碼
? 實際工程中條件編譯主要用於一下兩種情況 :
? 不同的產品線共用一份代碼
? 區分編譯產品的調試版和發布版
小結
? 通過編譯器命令行能夠定義預處理器使用的宏
? 條件編譯可以避免重復包含頭同一個頭文件
? 條件編譯是在工程開發中可以區別不同產品線的代碼
? 條件編譯可以定義產品的發布版和調試版
break 關鍵字可以用於按條件退出循環。當break的條件滿足時,會直接退出循環,而不再判斷循環條件和進行循環變量的遞增或者遞減。
實現此案例需要按照如下步驟進行。
步驟一:break的用法代碼如下所示:
#include int main() { for (int i = 0; ; i++) { int num; printf("請輸入一個整數(輸入0退出):"); scanf("%d", &num); if (num > 0) printf("%d是一個正數。\n", num); else if (num < 0) printf("%d是一個負數。\n", num); else break; } return 0; }
上述代碼中,以下代碼:
設置一個死循環。
上述代碼中,以下代碼:
首先,定義一個整型變量num,用於存儲輸入的一個整數。
然後,使用函數printf提示輸入的一個整數,並提示輸入0退出。
最後,使用函數scanf輸入的一個整數到變量score中。
上述代碼中,以下代碼:
如果輸入的整數大於0,則打印是一個正數。
上述代碼中,以下代碼:
如果輸入的整數小於0,則打印是一個負數。
上述代碼中,以下代碼:
如果輸入的整數等於0,則退出循環。如此使用break語句,可以實現不定次數循環。
本案例的完整代碼如下所示:
#include int main() { for (int i = 0; ; i++) { int num; printf("請輸入一個整數(輸入0退出):"); scanf("%d", &num); if (num > 0) printf("%d是一個正數。\n", num); else if (num < 0) printf("%d是一個負數。\n", num); else break; } return 0; }
實現“猜數字”小游戲。
實現此案例需要按照如下步驟進行。
步驟一:循環次數不確定的循環
#include #include #include int main() { srand(time(0)); int ran = rand() % 100 + 1; for(;;) { int num; printf("請輸入一個1到100之間的整數:"); scanf("%d", &num); if (num < 0 || num > 100) printf("輸入的數不在1到100之間。\n"); else if (num == ran) break; else if (num > ran) printf("大了\n"); else printf("小了\n"); } printf("猜對了\n"); return 0; }
上述代碼中,以下代碼:
設置隨機的算法種子。要使用隨機數,需要此句。
上述代碼中,以下代碼:
使用函數rand生成一個1~100之間的隨機數。
上述代碼中,以下代碼:
設置一個死循環。
上述代碼中,以下代碼:
首先,定義一個整型變量num,用於存儲輸入一個1~100之間的整數。
然後,使用函數printf提示輸入整數。
最後,使用函數scanf輸入整數到變量score中。
上述代碼中,以下代碼:
容錯保護,輸入的整數不在1~100之間,則重新輸入。
上述代碼中,以下代碼:
如果輸入的整數正好與隨機數相等,則使用break語句退出。
上述代碼中,以下代碼:
如果輸入的整數大於隨機數,則提示大了。
上述代碼中,以下代碼:
如果輸入的整數小於隨機數,則提示小了。
上述代碼中,以下代碼:
使用break語句退出循環後,提示猜對了。
本案例的完整代碼如下所示:
#include #include #include int main() { srand(time(0)); int ran = rand() % 100 + 1; for(;;) { int num; printf("請輸入一個1到100之間的整數:"); scanf("%d", &num); if (num < 0 || num > 100) printf("輸入的數不在1到100之間。\n"); else if (num == ran) break; else if (num > ran) printf("大了\n"); else printf("小了\n"); } printf("猜對了\n"); return 0; }
continue 關鍵字可以用於按條件中止本次循環,繼續下次循環。break 退出循環,continue不會退出循環,只是不再繼續執行本次循環。
實現此案例需要按照如下步驟進行。
步驟一:continue用法代碼如下所示:
#include int main() { for (int i = 0; i <= 100; i++) if(i % 2) continue; else printf("%d ", i); printf("\n"); return 0; }
上述代碼中,以下代碼:
設置一個循環,循環100次。
上述代碼中,以下代碼:
判斷循環變量,如果循環變量是奇數,則使用continue語句繼續循環。否則打印這個偶數。
本案例的完整代碼如下所示:
#include int main() { for (int i = 0; i <= 100; i++) if(i % 2) continue; else printf("%d ", i); printf("\n"); return 0; }
打印如下圖-2所示的圖形:
圖-2
實現此案例需要按照如下步驟進行。
步驟一:二重循環的使用代碼如下所示:
#include int main() { for (int i = 0; i < 5; i++) { for (int j = 0; j <= i; j++) printf("*"); printf("\n"); } return 0; }
上述代碼中,以下代碼:
設置一個外層循環,循環5次,代表打印5行。
上述代碼中,以下代碼:
設置一個內層循環,循環的次數由外層循環變量i決定,當i等於0時,打印一個*,當i等於1時,打印兩個*,依次類推。
由此可以看出外層循環負責打印多少行,內層循環負責在一行中打印多少個*。
上述代碼中,以下代碼:
此句非常重要,因為內層循環退出時,表示某行的*已經打印完畢,此時需要打印一個回車,以換行。
本案例的完整代碼如下所示:
#include int main() { for (int i = 0; i < 5; i++) { for (int j = 0; j <= i; j++) printf("*"); printf("\n"); } return 0; }
打印如下圖-3所示的圖形:
圖-3
實現此案例需要按照如下步驟進行。
步驟一:switch語句的使用
代碼如下所示:
上述代碼中,以下代碼:
設置一個外層循環,循環5次,代表打印5行。
上述代碼中,以下代碼:
設置一個內層循環,循環的次數由外層循環變量i * 2決定。當i等於0時,條件為j <= 0,所以循環一次,打印一個*。當i等於1時,條件為j <= 1 * 2,所以循環三次,打印三個*,依次類推。
由此可以看出外層循環負責打印多少行,內層循環負責在一行中打印多少個*。
上述代碼中,以下代碼:
此句非常重要,因為內層循環退出時,表示某行的*已經打印完畢,此時需要打印一個回車,以換行。
本案例的完整代碼如下所示:
#include int main() { for (int i = 0; i < 5; i++) { for (int j = 0; j <= i * 2; j++) printf("*"); printf("\n"); } return 0; }