C語言程序的絕大部分應該記錄在以".c "作為擴展名的文件里,這種文件叫做C語言源文件
C語言程序中還包括以".h "作為擴展名的文件,這種文件叫做頭文件
C語言程序中絕大多數語句應該寫在大括號里面
C語言程序中的大括號可以用來代表一個函數(函數可以看作一組語句)
函數內部的語句一定按照從上到下的順序執行
C語言程序中不可以沒有函數;每個函數都必須有名字,不同函數的名字不能相同
C語言程序中必須包含叫做main 的函數,它叫做主函數
程序一定從主函數的第一條語句開始執行,當主函數里最后一條語句結束時整個程序結束
函數結束時可以留下一個數字,這個數字叫做函數的返回值(也可以不留)
主函數應該有一個返回值,如果這個數字是0,表示程序員希望計算機認為程序正常結束了,如果是別的
數字則程序員希望計算機認為它錯了。
C語言程序中預先保留幾十個英文單詞,它們叫作關鍵字。
每個關鍵字都有特定的用途,不能隨意使用,所有關鍵字一定是由小寫英文字母構成
return就是一個關鍵字,它有兩個用途,主要用途是結束函數的執行,輔助用途是指定函數返回值的數值
計算機根據數字在某個方面的區別把數字分成幾組,每組叫做一個數據類型,每個數據類型都有自己的名字。
整數類型是一種數據類型,它的名字是int ,這個數據類型里包含幾乎所有不帶小數點的數字
程序中的所有數字必須有數據類型,程序中所有不帶小數點的數字都被默認成整數類型
C語言中規定函數如果有返回值則必須把返回值的類型名稱寫在函數名稱前
C語言程序中通常包含預處理指令
預處理指令一定是以"#"作為開頭,并且不是以";"作為結尾
標準C階段遇到的預處理指令會把源文件里的內容替換成其他內容
#include預處理指令可以把一個頭文件的內容包含到當前文件中
這個指令需要使用相對路徑表示被包含的頭文件所在的位置
把相對路徑包含在<>里,表示采用系統中預先準備好的一組目錄作為起點
把相對路徑包含在""里,表示首先把當前文件所在目錄作為起點使用,然后再把系統中預先準備好
的目錄作為起點使用
C語言程序中可以加入文字性的說明信息,這些信息必須加入到注釋區域里
計算機會直接忽略注釋區域里的所有內容
單行注釋以"//"作為開頭一直到行尾;多行注釋以"/*"作為開頭,以"*/"作為結尾
C程序中大量使用名字區分不同內容,這些名字叫做標識符;標識符最好采用英文單詞
標識符的編寫規則:
1.第一個字符應該是英文字母或者下劃線
2.后面的每個字符可以是英文字母,下劃線或者阿拉伯數字字符
3.大小寫不同的標識符是不一樣的(大小寫敏感)
4.關鍵字不可以作為標識符使用
5.標識符長度沒有限制,但是計算機只能截取前面一部分使用
C語言程序編碼規范
1.一行里最多包含一條語句
2.同級別的語句應該上下對齊(也就是語句左邊那一列對齊)
3.在合適的地方使用空格和空行
4.編寫標識符的時候可以采用駝峰方式或者下劃線方式,以此來利于標識符之間的區分,便于理解
編譯器可以把源文件翻譯成計算機能夠認識的格式
gcc是linux系統里C語言程序的編譯器
MinGw是Windows下的gcc(可以下載該軟件,然后在Windows下就可以使用gcc命令了)
Linux系統中C語言程序開發基本過程
1.使用vi 編寫源文件
2.使用gcc把所有源文件翻譯成可執行文件(編譯)
3.使用命令"./a.out " 執行得到的新文件
gcc編譯器工作過程
1.處理所有預處理指令(其處理結果就是得到一個新的源文件)
2.把第一步處理結果翻譯成計算機認識的格式(這一步也叫做“編譯”)
3.把第二步的處理結果合并成可執行文件(鏈接)
gcc選項介紹
“ -E ” 只處理所有預處理指令(也就是只完成第一步);也就是使用語句“gcc -E .c文件”
“-c ”只完成預處理和編譯工作,處理結果是以“.o ”作為擴展名的目標文件
“-o”用來指定得到的執行文件名稱,使用“gcc .c文件 –o 指定的文件名 ”
“-std=c89”,“-std=c99”這個選項決定采用什么版本的規范進行編譯,默認采用c89規范,
后者比前者功能更強,并且兼容前者
C語言中提供工具,它們叫做標準函數,每個標準函數用來解決一個常見的問題,不同標準函數的名稱不同
可以在程序中編寫函數調用語句使用標準函數
“PRintf”標準函數可以把程序中的結果打印在終端窗口里,使用“printf(“ 整數”)”,使用“printf(“ 整數/n”)”可以使打印出的整數單獨占一行
為了使用這個標準函數需要包含“stdio.h”的頭文件
可以在雙引號里使用占位符把數字轉移到雙引號的后面,使用“printf(“%d“,整數)”
在打印之前計算機會用雙引號后面的數字依次替換占位符,替換完后才進行打印
不同類型的數字應該和不同占位符配合使用,整數類型數字應該和“%d”配合使用
可以在一條打印語句中使用多個占位符,這時就應該在雙引號后面提供相應的多個數字,數字個數應該和占位符的個數一樣。計算機會依次使用這些數字替換前面的占位符。
如“printf(“a%db%dc/n”,1,2)”,會打印出“a1b2c”
雙引號后面的數字可以是一個計算公式,計算機會首先計算出結果,然后替換前面的占位符
程序中使用的所有數字必須記錄在內存里
計算機內存由大量字節組成,每個字節可以單獨記錄一個數字
每個字節有一個編號,不同字節的編號不同。這個編號叫做字節的地址
所有字節的地址從0開始向上遞增,只能通過地址找到字節。
內存中幾個相鄰的字節可以合并成一個整體,用來記錄一個數字
我們可以把內存中用來記錄一個數字的所有字節稱為一個存儲區(只在本課中使用,為了教學方便)
一個存儲區只能用來記錄一種類型的數字
存儲區也有地址,這個地址就是內部包含的所有字節中地址最小那個字節的地址
C語言程序中可以使用變量代表存儲區
對變量的操作就是對它所代表存儲區的操作
程序中所有變量必須先聲明然后才能使用,變量聲明語句可以用來聲明變量
變量聲明語句會讓計算機為程序分配一個存儲區
變量有兩種使用方法:
1.向變量代表的存儲區里放一個數字
(賦值語句可以向變量里放一個數字,賦值語句的核心就是賦值操作符“=”,
賦值操作符左邊代表存儲區的內容,這種內存叫左值,變量是最簡單的左值。
賦值操作符右邊應該寫一個代表數字的內容
賦值語句可以把右邊的數字放在左邊的存儲區里
可以在聲明變量的時候立即對變量進行賦值,這叫做變量的初始化
C語言里所有變量都應該初始化)
2.從變量代表的存儲區里獲得數字
(可以在程序中直接把變量當作數字使用,
計算機會首先從變量代表的存儲區里獲得數字,然后用這個數字參與其他計算)
變量名稱既可以代表變量的存儲區也可以代表那個存儲區里的數字,由環境決定
程序中使用變量名稱時,編譯器負責計算對應存儲區的地址
在變量名稱前加“&”可以計算出變量對應存儲區的地址
可以使用“%p”作為占位符把地址數據打印在屏幕上
可以在一條語句中聲明多個同類型變量
變量可以用來代表一個固定數字
變量真正的價值所在,是其可以用來代表一組數字,
這些數字任何時候只使用其中一個,且這些數字符合同樣的規律,
應該可以采用同樣的處理方式
字符類型是一種數據類型,它的名稱是“char”
字符類型里包含256個不同的整數,每個整數可以代表一個字符數據
(例如‘a’,‘^’等)
整數和字符僅僅是兩種不同的表示方式,但表示的內容是一樣的
ASCII碼表中列出了所有整數和字符之間的對應關系
ASCII碼表中所有小寫英文字母是連續排列的,其中‘a’的整數最小,‘z’的整數最大
所有大寫英文字母和阿拉伯數字字符也都符合這個規律
所有字符數據被分成兩組,每組包含128個
其中一組字符數據兩種表示方式之間的對應關系
在所有計算機上都是一樣的,它們的整數范圍從0到127
另外一組字符數據兩種表示方式之間的對應關系在
不同計算機上是不一樣的,它們的整數范圍可能從-128到-1,
也可能從128到255
所以在計算機中不要輕易將字符類型當作整數類型來使用
無符號字符類型也是一種數據類型,
它的名字是“unsignedchar”
它同樣包含256個不同的字符數據,這些數據的
整數范圍在所有的計算機上都是從0到255
所以這種類型的字符可以當作整數類型來使用
‘/n’ 代表換行字符
‘/r’ 代表回車字符
‘//’ 代表字符/
‘/' ’代表字符'
‘/'' ’代表字符''
短整數類型也是一種數據類型,里面包含65536個不同的整數
它的名稱是“short”
其中一半是非負數,另一半是負數,
以數字0為中心向兩邊擴展
無符號短整數類型也是一種數據類型,它的名稱是“unsignedshort”
它里面也包含65536個不同的整數,從0開始向正數方向遞增,不含負數
長整數類型也是一種數據類型,其名稱為“long”或著“long int”
里面包含2的32次方個不同的整數,其中一半是負數,另一半是非負數
以0為中心向兩邊擴展
無符號長整數類型名稱是“unsignedlong”或者“unsignedlong int”
里面包含2的32次方個不同的整數,從0開始向正數方向擴展,不包括負數
整數類型名稱是“int”
一般情況下,整數類型和長整數類型一樣
無符號整數類型名稱是“unsignedint”
一般情況下,無符號整數類型和無符號長整數類型一樣
所有只包含整數的類型,它們的數字范圍是
重疊的,并且逐級擴大
在程序中不帶小數點的數字后加“u”表示這個數字是無符號整數類型
C語言程序中使用浮點類型表示帶小數點的數字
浮點類型分為單精度浮點類型和雙精度浮點類型
雙精度浮點類型可以記錄更多小數點后面的數位
單精度浮點類型的名稱可以用“float”
雙精度浮點類型的名稱是“double”
程序中帶小數點的數字計算機默認它的類型是“double”型
如果在帶小數點數字后加“f”表示這個數字的類型是單精度浮點類型
C語言中允許程序員擴展新的數據類型
這些新的數據類型統稱為復合數據類型
復合數據類型需要先定義然后才可以使用
布爾類型是C99規范中引入的新的數據類型
布爾類型中只包含兩個整數,一個是真,另一個是假
計算機中用“1”表示真,用“0”表示假
任何一個整數都可以當作布爾值使用,“0”當作布爾值
使用時,當作假,其他所有整數當作布爾值使用時都是真
一般在程序中,不需要使用這個數據類型,直接用整數代替就可以
數據類型和占位符的對應關系
char 和 unsigned char 用 %c 表示 占據一個字節
short 用%hd 占據兩個字節
unsignedshort 用%hu 兩個字節
long 用%ld 4個字節
unsignedlong %lu 4個字節
int %d 4個字節
unsignedint %u 4個字節
float %f 或者%g 4個字節
double %lf 或者%lg 8個字節
%f 和%lf 會保留小數點后面多余的0
%g 和%lg 不會保留
例如打印“3.20”,前者會將其所有可以打印的“0”給打印出來,
而后者只會打印“3.2”
不同數據類型的一個主要區別就是存儲區里包含的字節個數不同
sizeof 關鍵字可以用來計算一個存儲區或者數據類型中包含的字節個數
sizeof()的括號里可以寫任何能當數字使用的內容
sizeof()的工作方式不是以函數的方式工作的,所以它不是一個函數,而是一個關鍵字
sizeof小括號里如果修改了任何存儲區中的內容,這個修改不會真正生效
scanf 標準函數可以把用戶在鍵盤上輸入的數字記錄在變量代表的存儲區里
為了使用這個標準函數,也需要包含<stdio.h>頭文件
在scanf函數調用語句中要使用存儲區的地址表示存儲區
雙引號里使用占位符表示存儲區的類型,如scanf("%d",&num)
在scanf函數調用語句的雙引號里不要寫占位符以外的其他內容,
否則容易出現意想不到的結果
可以在一條scanf函數調用語句中得到多個數字,如scanf("%d%d",&num,&num1)
如果用戶輸入的格式和程序要求的格式不一致,就可能得不到正確的數字
一個字節分成八段,每段只能記錄一個0或者1
要想把一個數字記錄在一個字節中,就必須首先把這個
數字拆分成八個0或者1
采用一組0和1表示數字的方法叫做二進制
二進制表示方式中,每個位置有一個編號,最右邊位置的
編號是0,向左以此遞增
某個位置上的1代表的數字是2的位置編號次方
在二進制表示方式中,如果兩個相鄰位置上的內容一樣,
則左邊的數字是右邊數字的2倍
(以上規則只適用于用二進制表示的非負數)
二進制數字加1時,把最右邊的所有1都變成0,把最右邊的0變成1
不停對數字除以2保留整數部分的操作,得到一組數字,其中每個數字在作
除以2取余得到每個數位上的內容。把所有余數按找從后向前倒敘書寫
就得到轉換結果。
負數十進制轉換為二進制
1.得到負數的相反數
2.把第一步的結果轉換成二進制
3.把第二步每個數位上的內容變成相反值
4.把第三步的結果加1
采用按位求反再加1的方法可以根據任何二進制數計算出相反的二進制數
有符號類型二進制最左邊的數位叫做符號位
根據它可以知道數字的正負,如果符號位是0則數字是非負數,
如果符號位是1則數字是負數
負數的二進制轉換成十進制
1.首先計算出相反數的二進制
2.把第一步的結果轉換成十進制
3.根據第二步的結果再計算相反數
當把占地大的整數賦值給占地小的整數類型存儲區
的時候,只保留最后的二進制數位,這將導致數據丟失
當把占地小的有符號類型整數賦值給占地大的整數類型存儲區時,擴展出來的二進制數位填充的都是符號位(不僅第一位是符號位,擴展出來的位數都是符號位)
這樣會保持十進制結果不變
把二進制從右向左每三個數位分成一組,每組用0到7之間的一個數字替代
這個結果叫做數字的八進制表示方式
二進制與八進制之間的轉換沒有正負之說,也就是說它們的轉換規則是一樣的
可以在程序中直接使用八進制方式表示數字,但必須以0(數字0)作為開頭
也就是說0之后才是表示的八進制數字
可以采用%o(字母o)作為占位符,把數字的八進制表示方式打印在屏幕上
把二進制數字從右向左每四個數位分成一組,每組用一個字符替換
(用a到f這六個字母代表10到15)
可以在程序中使用十六進制方式表示數字,必須以0x(數字0,字母x)作為開頭
可以用%x或者%X做占位符把十六進制表示方式打印在屏幕上
打印結果不是以0x作為開頭的,為了避免和十進制表示的數字沖突,我們可以
自己將0x加在打印結果的開頭
以%x作為占位符時,打印結果中英文字母都是小寫的
以%X作為占位符時,打印結果中英文字母都是大寫的
操作符用來描述對數字的處理規則
根據操作符所需要的數字個數,把操作符
分成單目操作符、雙目操作符、三目操作符
如果參與除法計算的兩個數字都是整數,則結果只保留整數部分
C語言中使用%表示取余操作
賦值操作符用=表示,可以把一個數字記錄到一個存儲區里
賦值語句可以當做數字使用,這個數字就是賦值完成以后存儲區里的數字
可以在一條語句中使用多個賦值操作符,這個時候先計算右邊的賦值操作符
絕大多數雙目操作符可以和賦值操作符合并形成復合賦值操作符,
如+=,%=
復合賦值操作符要求左邊能代表一個存儲區,右邊可以代表數字
這個操作符首先把兩邊都當作數字使用,按照雙目操作符的規則
進行計算,最后把計算結果記錄在左邊的存儲區里
復合賦值操作符的優先級和賦值操作符優先級一樣低
自增操作符(++),自減操作符(--),都是單目操作符
這兩個操作符必須和存儲區配合使用(不能和數字配合使用),它們可以把存儲區的內容做加1或者減1操作
它們各有兩種使用方法,一種是前操作(操作符寫在存儲區前面)
另一種是后操作(操作符寫在存儲區后面)
如果運算式中只有自增操作符時,二者沒有區別
如果這個操作符編寫的表達式當做數字使用時,
前操作當數字使用時,是修改后的數字
后操作當數字使用時,是修改前的數字
不要在一條語句中對同一個變量作多次自增自減運算,其結果是不確定的
邏輯操作符用來編寫邏輯表達式
邏輯表達式的計算結果一定是布爾值
! 是一個單目邏輯操作符,它表示對一個布爾值求反(真變假,假變真)
這個操作符使用的時候要寫在一個布爾值的前面
雙目邏輯操作符包括==(等于),!=(不等于),>(大于),<(小于),>=(大于等于),<=(小于等于)
最多包含一個雙目邏輯操作符的表達式叫做簡單邏輯表達式(為了講課方便而自己創作的)
C語言中如果一個邏輯表達式里包含多個雙目邏輯操作符則必須拆分成多個簡單邏輯表達式,然后再合并
可以使用“與”(&&)和“或”(||)把兩個邏輯表達式合并成一個新的邏輯表達式
如果兩個邏輯表達式的結果都是真,則用“與”(&&)連接后結果才是真,否則為假
如果兩個邏輯表達式的結果中有一個是真,則用“或”(||)連接后的結果就是真,否則是假
“與(&&)”和“或(||)”都具有短路的特性(如果前一個表達式可以決定整個表達式的結果,則后一個邏輯表達式根本就不計算)
位操作符可以直接操作二進制數位
“~”是一個單目位操作符,它可以把二進制中的每個數位求反(按位求反)
這個操作符應該寫在一個數字前面
雙目位操作符包括“按位與”(&),“按位或”(|),“按位異或”(^)
它們可以把兩個數字對應二進制數位上的內容進行計算
“按位與”(&)可以把對應二進制數位進行與計算,只要一個數位的內容是0則結果就是0
“按位或”(|)可以把對應二進制數位進行“或”計算,只要一個數位的內容是1,則結果就是1
“按位異或”(^)可以把對應二進制數位進行“異或”計算,如果兩個數位內容一樣,則結果就是0,否則結果是1
移位操作符可以把一個數字中的所有二進制數位統一向左或向右移動n個位置
“>>”表示向右移位操作
“<<”表示向左移位操作
二者都是雙目操作符,操作符左邊是將要進行移位操作的數字,右邊是移動的位數
移位操作相當于將每個數位上的內容放到了另外一個數位里
移位操作不會修改任何存儲區的內容,它會得到一個新數字,這個新數字即是移位操作以后的結果
向左移位時,右邊空出來的位置上一定補0
有符號類型數據向右移位時,左邊空出來的位置上補充符號位
無符號類型數據向右移位時,左邊空出來的位置上補充0
一般情況下(也就是移位時要保證有效數位不丟失),向左移動n個位置相當于數字乘以2的n次方,向右移動n個位置相當于除以2的n次方
&也可作為單目操作符來使用,這個時候它可以用來計算一個存儲區的地址,
這個操作符應該寫在一個存儲區的前面
可以使用“%p”作為占位符把地址數據打印在屏幕上,
打印結果是一個十六進制數字,并且自動在結果前面加上0x
“*”也可以作為單目操作符使用,這個時候它可以根據地址數據找到對應的存儲區
這個操作符應該寫在一個地址數據的前面
三目操作符可以從兩個計算規則中選擇一個使用
三目操作符格式如下:
布爾值?公式一 : 公式二
如果布爾值為真,則采用公式一計算結果,否則采用公式二計算結果
不要在問號后面寫賦值操作符
如果表達式中所包含的數字類型不同,則計算機會首先把他們轉換成同一類型,然后才進行計算
這個轉換過程叫做隱式類型轉換,完全由計算機完成
在隱式類型轉換中一定把占地小的類型轉換成占地大的類型
如果不同數字的大小一樣,則把整數類型轉換成浮點類型,把有符號類型轉換成無符號類型
在C語言程序中可以給數字指定一個類型,這叫做強制類型轉換
強制類型轉換語法如下:
(char)num 表示將num變量當做字符型變量使用
強制類型轉換有可能造成數據丟失
類型轉換不會修改任何存儲區的內容,計算機會使用一個新存儲區記錄轉換后的數字,然后用這個新存儲區做其他計算
分支語句可以從幾組語句中選擇一組執行
“if”關鍵字可以用來編寫分支語句
if分支使用一個布爾值決定一組語句是否要執行,如果布爾值為真則執行,否則就不執行
如果多個分支中任何兩個都不可能同時執行,就可以使用“else”關鍵字把它們合并
如果合并好的多個分支中必然會執行一個,則可以省略最后一個分支的邏輯表達式
合并好的多個分支,邏輯表達式之間有前后順序,只有當前面的邏輯表達式結果為假,才會計算后面的邏輯表達式
在合并多個分支的時候,可以利用這一點簡化邏輯表達式
已經合并好的分支不可以當作多個無關分支來理解,因為合并后已經將邏輯關系給簡化了
如果一個分支里包含有限個整數,每個整數使用專門的語句處理,這種分支可以采用
“switch...case”的方法實現
循環語句可以讓同樣一組語句反復多次運行
“for”關鍵字可以用來編寫循環
for循環中可以讓一個變量依次代表一組數字,然后使用同樣一組語句處理每個數字
這個變量叫做循環變量
采用如下結構描述循環變量的變化過程:
(①;②;③)
①把開始數字賦值給循環變量
②用邏輯表達式描述循環變量和結束數字的關系
③循環變量的變化規律
假如有如下for循環
for(1;2;3){
4
}
它按照如下方式分組執行:
[1,2][4,3,2][4,3,2].....[4,3,2]
只有第一組與其他組不同
正常情況下for循環一定是在兩組之間結束的
如果某一組最后編號為2的邏輯表達式結果為真則啟動下一組,否則結束循環
如果循環正常結束則結束后循環變量一定落在范圍之外
for循環執行時有可能不執行大括號里的語句
for循環小括號里的每一部分都是可以省略的
如果小括號里的邏輯表達式沒有寫則表示這個邏輯表達式的結果永遠為真。這種循環不能正常結束,所以叫做死循環。
小括號最前和最后的部分可以是用逗號連接的多條語句
C99規范中允許在小括號里臨時聲明循環變量
這個循環變量只能在循環里使用,循環結束后就不能用了
可以在循環中使用“break”語句,立即結束循環的執行
一旦執行了“break;”語句,循環中的一切語句都不再執行,循環變量也不會再變化。
如果循環采用“break;”語句結束,則結束后循環變量在范圍內
break語句只會結束直接包含它的循環。
可以在循環中使用“continue;”語句,直接跳到循環大括號的末尾,中間所有的語句這次都不執行了
如果編寫循環的時候無法計算出循環需要執行的次數,那么就可以編寫一個死循環,在循環中使用分支和“break;”語句結束循環。
無法預先知道的數字叫做隨機數
“rand()”標準函數(括號中沒有參數)可以用來獲得隨機數,為了使用這個標準函數需要包含“stdlib.h”頭文件
“srand()”標準函數用來設置隨機數種子,這個函數把一個整數作為種子使用,將這個函數單獨放在一條語句中使用。
為了使用這個標準函數也需要包含頭文件“stdlib.h”
為了保證“srand( )”函數只執行一次,一般把其放在主函數的開頭,
該函數相當于種樹,所以只應該執行一次,如果多次執行,所得結果是一樣的。
“time()”標準函數可以用來獲得當前時間
為了使用這個標準函數需要包含“time.h”頭文件
這個整數的解釋是這樣的:從0時區1970年0時0分0秒到現在一共經歷的秒數。
使用時用time(0)來表示把當前時間來當作種子使用,注意括號中的0并不是數字0的意思
分支和循環都是流程控制語句,它們都可以讓程序中的語句不再從上到下的順序執行
“goto”語句也是流程控制語句,它可以把任意一條語句指定成下一條語句
一般不建議使用該語句,因為該語句很危險。
循環里面還可以再寫循環,這種結構叫做多重循環
如果一個問題不容易直接解決,但是它可以被分解成幾個小問題,而且每個小問題的解決方法非常類似。那么這種問題就可以采用多重循環的方式來解決。
“while”關鍵字也可以用來編寫循環,這種循環可以用來實現無法預知次數的循環
while循環格式如下:
while(邏輯表達式){
反復執行的語句
}
只要邏輯表達式結果為真,大括號里的語句就反復執行。
while循環的邏輯表達式寫成1就成了死循環
while循環里也可以使用“break;”和“continue;”語句。
while循環中邏輯表達式的判斷和語句的執行是交替進行的,永遠先判斷邏輯表達式
while循環有可能不會執行任何語句。
do...while格式也可以用來實現循環
可以把do...while格式看成while格式的變體
do...while格式里必須在最后的小括號后面加“;”
do...while循環中邏輯表達式的判斷也是和語句的執行交替進行,只不過永遠后判斷邏輯表達式。
do...while循環中語句至少會執行一次
在不同速度的設備之間傳遞數據需要使用緩沖區
“scanf()”函數工作時需要使用一個叫做“輸入緩沖區”的緩沖區
用戶在鍵盤上輸入的內容首先進入輸入緩沖區,程序從輸入緩沖區里獲得數字
先進入輸入緩沖區的數字必須首先被處理
如果用戶輸入的格式和程序要求的格式不一致,則會導致從這個數據開始的所有數據都無法處理了。
可以使用如下兩條語句把輸入緩沖區里的錯誤數據給丟棄
scanf(“%*[^/n]”);//把輸入緩沖區里第一個換行字符前的所有內容丟棄
scanf("%*c");//把換行字符丟棄
printf函數使用了輸出緩沖區
輸出緩沖區里的內容在如下四種情況下才會顯示在屏幕上:
1.如果輸出緩沖區里有‘/n’換行字符則它前面的所有內容顯示在屏幕上(此時不管程序是否結束)
2.程序結束后所打印的內容會顯示在屏幕上
3.當輸出緩沖區被充滿的時候里面的內容會顯示在屏幕上
4.在程序中使用“fflush(stdout)”語句可以把輸出緩沖區里的內容顯示在屏幕上
數組可以用來代表內存中一組連續的同類型存儲區
數組也需要先聲明然后再使用
聲明數組的時候,需要提供類型名稱和數組名稱,除此之外還需要一個存儲區個數
任何數組一旦存在則里面包含的存儲區個數就不可以改變了
數組一般不可以作為整體使用,通常一次只能使用其中的一個存儲區
數組中每個存儲區有一個編號,這個編號叫做數組的下標。
第一個存儲區的下標是0,向后依次遞增。
下標范圍從0開始到個數減1為止,超過范圍的下標不可以使用
下標就可以用來表示數組中的存儲區
可以使用for循環依次處理數組中每個存儲區
在這個循環里循環變量依次代表每個存儲區下標
數組應該進行初始化,并滿足如下規則:
1.數組初始化的時候應該把初始化數據寫在一對大括號里,不同數字之間使用‘,’隔開。
2.計算機把所有初始化的數據按照從前到后的順序依次初始化數組中的每個存儲區
3.如果初始化數據個數多余存儲區個數,則多余的數據被自動忽略
4.如果初始化數據個數少于存儲區個數則后面的存儲區自動被初始化為0
5.如果初始化數據個數和存儲區個數一致,則可以省略數組聲明語句中的個數
數組名稱不能代表任何存儲區
數組名稱代表數組中第一個存儲區的地址(是一個數)
而變量名稱可以代表存儲區和存儲區內的數字
可以對數組名稱進行sizeof計算,結果是數組中所有存儲區所包含字節個數的總和
C99規范中允許使用變長數組
聲明變長數組時可以使用變量表示存儲區個數
如果多次運行這個程序則每次數組中包含的存儲區個數可能不同
每次程序運行過程中數組中存儲區個數不會變化
變長數組不可以初始化
可以采用sizeof關鍵字計算變長數組的大小
多維數組可以用來描述存儲區的分組情況
一維數組不能描述存儲區的分組情況
二維數組是最常見的多維數組,二維數組只描述了一次分組情況
聲明二維數組時需要提供兩個整數,前一個整數表示分組個數,后一個整數表示每組中存儲區個數
使用二維數組時,需要提供兩個下標,前一個下標用來表示分組編號(組下標)后一個下標用來表示組內存儲區編號(組內下標)
組下標的范圍從0開始到分組個數減1為止
組內下標的范圍從0開始到組內存儲區個數減1為止
可以采用一維數組初始化的方法對二維數組進行初始化(就是在大括號中將數字分別用逗號‘,’隔開)
也可以在初始化的時候對初始化數據進行分組,每一組用來初始化一組存儲區(就是在大括號里再用另外的大括號進行分組)
如果可以根據初始化數據計算出分組個數則可以省略聲明中的分組個數(但組內個數是不能省的)
數組名稱只能代表數組中第一個存儲區的地址
數組名稱不可以被賦值
二維數組名稱使用時也可以只提供一個下標,這種寫法表示下標對應組中第一個存儲區的地址
有時候可以使用這個寫法代表這一組存儲區
C語言中可以采用分組的方式管理程序中的語句,我們把每個分組叫做一個函數
多函數程序的執行模式如下:
1.整個程序的執行時間被劃分成幾段,不同段被分配給不同的函數使用
2.所有時間段之間不能重疊而且必須連續
3.如果函數A在工作工程中把一段時間分配給函數B則函數B完成工作后必須把時間還給函數A
如果函數A在工作過程中把時間分配給函數B,則它們之間存在函數調用關系
在這個關系中,函數A叫做調用函數,函數B叫做被調用函數
函數調用關系是有時間范圍的,只要被調用函數已經開始但還沒有結束則調用關系存在
函數調用語句可以在程序執行過程中產生函數調用關系
一般情況下,一個函數不能使用其他函數的存儲區
如果函數被分配了多段時間,則不同時間段內使用不同存儲區
不同函數內部的變量可以重名
函數調用過程中通常伴隨著函數之間的數據傳遞
函數傳遞存在兩個完全相反的方向,既可以從調用函數向被調用函數傳遞,也可以從被調用函數向調用函數傳遞
無論哪個方向的數據傳遞都需要記錄在被調用函數提供的存儲區里
從被調用函數只能向調用函數傳遞一個數據,這個數據叫做被調用函數的返回值
函數的返回值必須記錄在被調用函數提供的一個存儲區里,這個存儲區的類型名稱應該寫在函數名稱前
如果函數不提供這個存儲區,則必須在函數名稱前寫“void”
如果函數名稱前什么都沒寫,則C89規范中規定表示函數提供了一個整數類型的存儲區,而C99規范中不允許這樣
被調用函數里使用“return”關鍵字向這個存儲區里放返回值數據(這是被調用函數使用該存儲區的唯一方式)
調用函數可以把函數調用語句當作數字使用,這就可以得到這個存儲區里的返回值(這是調用函數使用該存儲區的唯一方式)
這個存儲區不可以用來長期保留數字,得到返回值以后或者立刻使用或者存儲到其他存儲區里。
如果被調用函數沒有使用“return”關鍵字向這個存儲區里放數字,則存儲區里的數字是隨機的。
“return”語句既可以返回函數值,也可以表示結束一個函數的執行。
被調用函數不可以采用數組記錄返回值,這就意味著函數名前不能寫成數組類型
任何函數只能使用單一的存儲區作為自己的返回值
為了從調用函數向被調用函數傳遞數據也需要被調用函數提供一組存儲區,這些存儲區的個數和類型可以是任意的
可以在被調用函數名稱后的小括號里聲明一組變量,這些變量就用來表示上面提到的存儲區
如果聲明多個變量,就用逗號“,”分來
這些變量叫做函數的形式參數,小括號里的整體叫做形式參數列表
每個形式參數的類型名稱都不可以省略,即使這些參數的類型一樣
調用函數不能直接使用這些存儲區,調用函數只提供一組數(稱為“實際參數”),計算機將這些實際參數記錄在形式參數的存儲區里,然后被調用函數就可以像使用普通變量一樣使用這些形式參數
只要能當作數字使用的內容,都可以作為實際參數來使用
函數可以不提供這組存儲區,此時應該在函數名稱后的小括號里寫“void”
如果函數名稱后面的小括號里什么都沒寫,則表示函數可以提供任意多個任意類型的形式參數
數組可以作為形式參數使用(僅僅把形式參數寫成數組聲明的格式,但是真正的形式參數不是數組)
數組形式參數中包含的所有存儲區都不是被調用函數提供的,但是被調用函數可以使用(調用函數當然也可以使用)
使用數組作為形式參數可以讓被調用函數使用其他函數提供的存儲區
可以利用數組形式參數實現雙向數據傳遞,這種參數叫做“輸入輸出參數”
數組做形式參數的時候可以省略數組聲明里的存儲區個數(因為真正的形式參數并不是數組)
數組做形式參數的時候需要另外提供一個形式參數表示數組里的存儲區個數(以免進行非法操作,也就是避免超出數組的維度)
C語言中函數參數的個數可以是不確定的,這種參數叫作變長參數
變長參數不能在編寫函數的時候命名
被調用函數里需要使用特殊的方法獲得沒有命名的參數
如果編譯器首先遇到函數調用語句,則它會猜測函數的格式,這個猜測的結果叫做函數的隱式聲明
所有函數的隱式聲明都包含一個整數類型的存儲區用來存放返回值,包含任意多個任意類型的形式參數
隱式聲明中所有參數的類型或者是整數或者是雙精度浮點類型
如果隱式聲明的格式和函數的實際格式發生沖突,則編譯的時候會報錯。
任何函數可以分為函數聲明和函數體這兩部分
函數聲明是可以單獨寫成一條語句的
函數聲明語句里可以省略形式參數名稱,但類型不能省略
可以把函數聲明語句單獨寫在文件開頭,這叫做“函數的顯示聲明”
函數的顯示聲明可以避免隱式聲明
除了主函數之外的所有函數都應該進行顯示聲明(主函數之所以不需要函數聲明,是因為主函數不會成為被調用函數而被其他函數調用)
“return”關鍵字可以隨時結束函數的執行,只需使用語句“return;”
exit()標準函數可以隨時結束整個程序
為了使用這個函數需要包含stdlib.h文件
這個函數需要一個整數類型的實際參數,這個參數用來告訴計算機程序的結束方式,數字“0”表示程序正常結束,其他整數表示遇到問題。
新聞熱點
疑難解答