第一章 C語言概述
1、C語言的歷史(1.1)
起源:貝爾實驗室開發的UNIX操作系統的副產品。標准化:C89和C99。基於C的語言:C++,Java,C#,Perl。
2、C語言的優缺點(1.2)
優點:高效、可移植、功能強大、靈活、標准庫、與UNIX和Linux集成;缺點:C程序更容易隱藏錯誤、C程序可能難以理解、C程序可能會難以修改。
高效使用C的方法
1.學習如何規避C語言的缺陷(C陷阱與缺陷);2.使用軟件工具使程序更加可靠(lint工具和調試工具);
3.利用現有的代碼庫;4.采用一套切合實際的編碼規范;5.避免“投機取巧”和極度復雜的代碼;6.緊貼標准(C89和C99)
第二章 C語言基本概念
1、編寫一個簡單的C程序(2.1):編譯和連接
預處理:執行以#開頭的命令,類似於編輯器,可以給程序添加內容,也可以對程序進行修改;
編譯:編譯器將程序翻譯成機器語言(即目標代碼);
鏈接:連接器把由編譯器產生的目標代碼和所需的其他附加代碼整合在一起,附加代碼包括庫函數。
2、簡單程序的一般形式(2.2):C程序由指令、函數和語句組成。
指令:一般是預處理器執行的命令,類似於#define,#include <stdio.h>;函數:程序員編寫的函數和庫函數;語句:程序運行時執行的命令,每條語句由分號結束。
main函數最后的return 0;語句。作用:一是使main函數終止,二是指出main函數返回值是0.
3、注釋(2.3):每個程序都應該包含識別信息,即程序名,編寫日期,作者,程序的用途及其他相關信息。/* */和//
4、變量和賦值(2.4)
每個變量必須有一個類型。使用變量之前必須對其進行聲明。
float型變量運算比int型變量慢,float型變量所存儲的數值只是實際值的一個近似值。
書寫格式方面,建議在聲明和語句之間留出一個空行。
給float型變量賦值時,最后在后面加一個f,例如float profit = 21.34f;
占位符%d用來指明在顯示過程中變量的值的顯示位置。
沒有默認值且尚未在程序中被賦值的變量是未被初始化的。
C語言通用原則:在任何需要數值的地方,都可以使用具有相同類型的表達式。printf("Volume (cubic inches): %d\n", height * lenght * width);
5、讀入輸入(2.5)
printf中的字母f和scanf中的字母f含義相同,都是表示“格式化”的意思。
scanf函數需要知道將獲得的輸入數據的格式,而printf函數需要知道輸出數據的顯示格式。
6、定義常量的名字(2.6)
C程序規范:#define宏定義的名字都使用大寫字母表示。
#define SCALE_FACTOR (5.0f / 9.0f) 添加上f
7、標識符(2.7)
傳統C中命名中間插入下划線,例如symbol_table,current_page
目前流行的java(C#及C++)用單詞首字母大寫,例如symbolTable,currentPage
8、C程序書寫規范(2.8)
語句可以分開放在任意多行內;記號間的加空格可以更容易區分記號;每個逗號后邊也放一個空格;縮進幫助識別程序;空行可以把程序划分成邏輯單元;
第三章 格式化輸入/輸入
1、printf函數(3.1)
printf函數用來顯示格式串的內容,並且在該串中的指定位置插入可能的值。格式串包括普通字符和轉換說明。
轉換說明:%m.pX格式或者-m.pX格式來表示。m(最小字段寬度):指定要顯示的最小字符數量;p(精度),+和-表示右對齊和左對齊。
轉義序列:使字符串包含一些特殊字符而不會使編譯器引發問題。警報(響鈴)符:\a;換行符:\n;水平制表符:\t。
2、scanf函數(3.2)
檢查轉換說明數量是否與輸入變量數量相匹配;檢查每個轉換是否適合相對應的變量;scanf每個調用變量前需要有&。
許多專業程序員避免使用scanf函數,而是采用字符格式讀取所有數據,然后再把他們轉換成數值形式。
scanf函數本質上使一種“模式匹配”,試圖吧輸入的字符組與轉換說明相匹配。
用戶從鍵盤輸入時,程序並沒有讀取輸入,而是把用戶的輸入放在一個隱藏的緩沖區中,由scanf函數來讀取。
第四章 表達式
1、算術運算符(4.1)
一元運算符什么都不做,在經典C中不存在這種運算符。
把int型操作數和float型操作數混合在一起時,運算結果時float型的。
運算符%要求操作數十整數。當運算符/和運算符%用於負操作數時,其結果難以確定。
通用規則,C語言允許在所有表達式中用圓括號進行分組。
運算符的左結合和右結合。
2、賦值運算符(4.2)
表達式v=e,如果v和e的類型不同,那么賦值運算發生時會把e的值轉化為v的類型。
在C語言中,賦值就像+那樣是運算符。即賦值操作產生結果。賦值表達式v=e的值就是賦值運算后v的值。
第五章 選擇語句
1、邏輯表達式(5.1)
關系運算符可以用於比較整數和浮點數,也允許比較混合類型的操作數。因此1<2.5的值為1。
關系運算符的優先級低於算術運算符。表達式i + j < k - 1的意思是(i + j)<(k - 1)。判等運算符的優先級低於關系運算符。
邏輯運算符所產生的結果時0或1。
2、if語句(5.2)
把==運算符與=運算符相混淆是最常見的C語言編程錯誤。
復合語句,通過在一組語句周圍放置花括號,可以強制編譯器將其作為一條語句來處理。
對於if else 語句在不必要的情況下使用花括號有兩個好處。首先,程序很容易修改,然后,可以避免忘記使用花括號而導致的錯誤。
條件表達式使程序更短小但也更難以閱讀,所以最好避免使用。用於兩種地方:1.return語句;2.某些類型的宏定義中。
if (i > j)
return i;
else
return j
替換為
return i > j ? i : J;
if (i > j)
printf("%d\n", i);
else
printf("%d\n", j);
替換為
printf("%d\n", i > j ? i : j);
為了便於理解,C89的程序員通常使用TRUE和FALSE這樣的名字定義宏:
#define TRUE 1
#define FALSE 0
C99中使用_Bool型,例如:_Bool flag;_Bool只能賦值為0或1
或者包含<stdbool.h>,可以寫為bool flag,<sdbool.h>中提供了ture和false兩個宏,分別代表1和0.
第六章 循環
1、常見循環類型
while語句;do語句;for語句
2、for語句(6.3)
21.for語句的慣用法
從0向上加到n-1:for( i = 0; i < n; i++)
從1向上加到n:for( i = 1; i <= n; i++)
從n-1向下減到0:for(i = n - 1; i >= 0; i--)
從n向下減到1:for( i = n; i > 0; i--)
2.2 C99中的for語句
在C99中,在for語句的第一個表達式中可以替換為一個聲明
for(int i = 0; i < n; i++)
2.3退出循環
break語句:跳出循環或者switch語句,但是不能從switch中跳出循環。
continue語句:跳過某次迭代的部分內容,但不會跳出整個循環。
goto語句:讓程從一條語句跳轉到另一條語句。goto語句必須和goto標識符在同一個函數中。
goto語句的缺點:1.goto語句可以往前跳也可以往后跳,使程序難以閱讀;2.goto語句使程序難以修改。
2.4空語句
語句可以為空,除了末尾處的分號以外什么符合也沒有。
空語句有一個好處:編寫循環體的循環。
C程序員習慣性把空語句單獨放置在一行。
for(d = 2; d < n && n & d != 0; d++)
;
其他使用空語句的地方
for(d = 2; d < n && n & d != 0; d++)
continue;
for(d = 2; d < n && n & d != 0; d++)
{}