1. 程式人生 > >c++學習筆記(二)-- c語言基礎

c++學習筆記(二)-- c語言基礎

c語言基礎

課程來源:coursera:程學設計與演算法(Peking University,北京大學)
課程連結:程式設計與演算法

本篇簡介:這一部分是系列課第一節的後半部分,主要總結了c語言的資料型別、運算成分和控制結構。

一. 從現實問題到計算機程式

1.1 結構化程式設計

先有解決方案,再有程式。
先粗後細,先抽象後具體。
寫程式前,先想好程式的結構,先寫出程式輪廓,再考慮補充變數。按照由大到小、由粗到精的多個模組組合而成,模組之內高內聚,模組之間低耦合。

1.2 c語言的由來和標準

c語言的由來:
1972年至1973年,Dennis Ritchie和Ken Thompson在B語言基礎上發展了C語言。
1979年,Bjarne Stroustrup開發了“C with classes”,即後來的C++。
c語言的標準:
C語言規範定義非常寬泛,經常導致不同編譯器上有不同的解釋,並且不同平臺上執行結果不同。

1.3 c語言的構成

基本成分為以下四種:
資料:資料型別與使用方法
運算:運算子號與使用方法
控制:三類控制語句怎麼寫
傳輸:如何輸入和輸出資料
任何程式均有如上四種成分,可按照這四種成分進行程式語言的學習。下面就說明c語言的資料、運算和控制成分。

二. c語言資料型別

2.1 變數的定義

記憶體:把記憶體想象為一條長條,每一條8位(8bit),8位作為一個位元組(Byte),每個位元組都有一個16進位制字元作為地址。
變數:值可以變化的量。在c語言中一定要先定義再使用。
定義格式:int Max=0;
變數定義的理解:開闢一片儲存空間,命名為Max,把值放入這片空間,並把空間的首地址與Max名字進行關聯。

2.2 整數型

以VC編譯器為基礎:

基本型:int,32bit
短整型:short int,16bit (int可以省略)
長整形:long int,32bit (int可以省略)
有符號:signed int;不寫signed的時候預設為有符號
無符號:unsigned int;其他型別只需將int換掉即可

對於所佔位元組長度,國際規範只要求long>=int>=short,不同的編譯器要求是不同的。可以使用 sizeof(int) 計算某種型別的物件在記憶體中所佔的位元組數,方便在不同編譯器檢視。

整數型別的儲存:
儲存的是補碼,正數原碼=補碼,負數補碼=原碼+1(符號位不變)
無符號數:轉換為二進位制。
有符號數:第一位作為正負,稱為符號位。正數同無符號數,符號位為0;負數符號位為1,其它位取反。
這樣做非常有利於運算。

整數的輸出:
列印一個十進位制數的16進製表示:
cout<<hex<<a<<endl;
oct-八進位制;dec-十進位制

整數的輸入:
轉為16/8進位制數,直接輸入即可:
int a = 0x7FFFFF85,0x表示十六進位制數,0表示八進位制

最大整數:
無符號數:2^32-1(42億)
有符號數:2^31-1(第一位是符號位)

最小整數:
無符號數:0
有符號數:最高位為1,其它位為0。正好為最大整數+1。這個數表示-2147483648。c語言規定,最高位為1,其它位為0的時候,最高位既表示負號,也表示整數最高位。

2.3 浮點型

浮點型又稱實型,主要有如下幾類。

float(單精度浮點型):32bit,7個有效位
double(雙精度浮點型):64bit,15個有效位
long double:64bit,15個有效位

vc中,long double和double型相同。
有效位表示精度,精度即輸出時正確的小數位數,超過精度的小數位無法被正確地顯示。
注:cout預設列印6位精度,更改列印精度(小數位數)用如下語句:
cout<<setprecision(100)<<a<<endl;
只需要設定一次。注意要在標頭檔案加上#include< iomanip >用於格式化輸出。

浮點型的儲存:
第一位為符號位;
2-9位為指數位(含一位符號位);
其它位為二進位制小數位,預設為1.xxxx。

2.4 字元型

一個字元型佔一個位元組,其值可以是任何可以出現的字元,最多可以表示256個字元,即ASCII碼。
儲存型別與整型相同,因此可以相互賦值並運算。
轉義字元:\n(換行),\a(聲音),\(輸出一個引號)。
定義方式:char a = ‘a’

2.5 布林型

儲存真假的變數
佔一個位元組,值為0或1,0表示False,1表示True。可以賦任何值,0存為0,非零存為1。
定義方式:bool b1 = true

2.6 常量

常量:程式執行過程中,值保持不變的量
字面常量:程式中的數
符號常量:一個識別符號代表一個常量,例如const double PI = 3.14159
常量的型別:字尾表示
L-長整形常量;0x-L長整形十六進位制常量;U-無符號整型常量;0-U-無符號長整形八進位制常量;F-單精度浮點型常量;L-長雙精度浮點型常量。
不寫常量型別時,預設為double,U、L、F均可小寫。

2.7 變數的命名

識別符號:字母、數字、下劃線組成,且第一個字元必須為字母或下劃線,不可與保留字(關鍵字)相同

匈牙利命名法:
以一個或多個小寫字母開頭,指定資料型別;
其後是一個或多個第一個字母大寫的單詞,指出變數的用途。
例如:chGrade;bOnOff

駝峰命名法:
有一個或者多個單詞連結,第一個單詞小寫字母開頭,之後單詞首字母均大寫。

三. c語言運算成分

3.1 賦值運算子

賦值運算子:=,給=左邊的變數賦予數值

要點一:兩邊型別不同
型別轉換,無論右邊是什麼型別,都轉換為左邊的型別。
要點二:長數賦給短數
擷取長數的低n位送給短數。
要點三:短數賦給長數
原來是什麼數,現在還是什麼數。無符號數,高位補0;有符號數,short符號位0,高位補0;short符號位0,高位補1。
要點四:符號位的賦值處理
直接賦值,不管符號位還是數字位。

表示式:程式中由運算子、運算元和括號組成的計算式。表示式有值,賦值語句也不例外,其值為通過賦值符號傳送的值

複合賦值運算:
a += 3等價於 a = a + 3,在賦值符號前加上其他運算子號

連續賦值運算:
自右而左的結合順序,有其他運算子時,要看運算子的優先順序

3.2 算術運算子

基本運算+、-、*、/、%
%表示模運算,必須是整數
注意:
整數運算結果仍是整數,小數被忽略
實數運算,結果均為double型
舍入的方向隨編譯器不同而不同

算術運算子優先順序:
()優先,*/%次之,然後±,同一級別中,採取由左向右的結合方向

剪刀法求表示式的值:按優先順序,逐級斬斷表示式,按優先順序從高到低運算

資料型別轉換:
char, short無論和誰運算,均轉換為int型;同理,float轉為double。整體順序為int-unsigned-long-double。前者和後者運算,前者先轉為後者再運算,並且結果型別為後者。

自增自減運算:
++i,–i:使用i之前,先加(減)1
i++,i–:使用i之後,再加(減)1
後置++號運算優先順序高於±,因此-i++會列印-i,然後i++
前置++號同級,但是右結合,因此-++i會列印-(i+1),然後i++
++只能用於變數,不能用於表示式,例如(-i)++就會編譯錯誤

輸出自增自減:
輸出語句包含多個表示式,優先計算右邊的表示式

3.3 關係運算符

高優先順序:< > <= >=
低優先順序:== !=
關係運算表示式的值:只有真假,真為1,假為0.
算數運算子>關係運算符>賦值運算子

3.4 邏輯運算子

與:&&
或:||
非:!
以0代表假,以非0代表真
優先順序:!>&&>||

混合運算優先順序:
邏輯非>算術>關係>邏輯與或>賦值運算

邏輯運算取捨:
只有執行下一個邏輯運算子才能求出表示式的解的時候,才執行該運算子

擴充套件:
邏輯運算子兩側可以是任何型別,如字元、實型或指標型,系統只按0和非0判斷。

3.5 其它運算子

逗號運算子:,
把表示式連起來,表示式1,表示式2,······,表示式n,先求1,再求2······,整個表示式值為表示式n的值。
逗號表示式是運算子優先順序最低的。

條件運算子:
表示式1?表示式2:表示式3
表示式1為真,以表示式2的值為條件表示式的值,否則以表示式3作為條件表示式的值

強制型別轉換:
(double)a:a的值轉為double,被轉換的量(a)型別並沒發生變化

3.6 位運算子

位運算:二進位制位的運算
位運算子:
雙目運算子:
按位與&,
按位與|,
按位異或^(相同為0,不同為1)
單目運算子:
取反~,
左移運算子<<(高位溢位直接捨棄,空位補0,捨棄高位沒有1左移一位相當於乘2),
右移運算子>>(低位溢位直接捨棄,無符號數空位補0,捨棄低位沒有1右移一位相當於除以2)(對有符號數,正數移入0,負數取決於計算機系統,移入0稱為邏輯右移,移入1成為算術右移,vc使用算術右移)

不同長度的資料進行位運算,右端對齊。無符號型或者正數左邊補滿0,負數補滿1

位運算常與賦值運算複合,例如:
a &= b 即 a = a & b

位運算子在c++的課程裡會詳細介紹,在初級階段使用不多,僅供瞭解。

四. c語言控制結構

4.1 控制成分

1966年,G.jacopini和C.Bohm發表論文證明,任何具有單入口單出口的程式都可以用三種基本結構表達:順序、迴圈、分支。

Goto語句:無條件轉向
goto 語句標號(識別符號,命名規則同變數),識別符號可以出現在任何地方

爭論:是否該有Goto語句
第一門高階語言Fortran大量使用goto語句,但著名教授E.W.Dijkstra1965年於IFIP中提出,goto語句應當取消。
1974年,Donald E.Knuth作出了全面公正的評述。(這裡我沒記,大概意思就是有的時候用很有幫助但用得太多對程式不好······)

4.2 分支結構

分支結構:if()
先對括號內表示式求解,括號內可以是任何資料型別,包括整型、實型、字元型、指標型,0按假,1按真處理

多分支語句:
switch(){
case 常量表達式1:語句1;
case 常量表達式2:語句2;
······
default:語句n+1;
}
如果表示式的值與某一個case後的常量表達式值相等,就執行此case之後的語句;全部不相等,執行default。
想執行單條語句,可以加break。
case可以共享語句,如果某條case之後沒有語句,則一直共享到有語句的那條為止。
default放在前面,可以不執行。也提供一個入口。如果仍舊全部不匹配,就執行default。

4.3 迴圈結構

for迴圈:
for (表示式1;表示式2;表示式3){
語句;
}
進入迴圈執行表示式1,只執行一遍;
表示式2為真,執行語句,再求表示式3。直到表示式2為假。

while迴圈:
while(條件語句){
語句;
}
條件語句為真即執行語句。
語句中必須改變條件語句,否則容易進入死迴圈。

do-while迴圈:
do{
執行語句
}while(條件語句);
先執行,再判斷條件。至少會被執行一次。

break語句:跳出本層迴圈,執行下一條。注意只跳出一層。
continue語句:結束本次迴圈,判定迴圈表示式決定是否執行下一次迴圈。

謝謝各位看到這裡,以上就是c++全部基礎知識的總結,後續的三個部分分別涉及陣列+字串、函式+遞迴、指標,習題部分的筆記會另外寫的,敬請期待!