一、 數(shù)據(jù)類型及運算
求補碼
原碼的基礎(chǔ)上, 符號位不變, 其余各位取反, 最后+1
原碼轉(zhuǎn)補碼不考慮符號位
補碼轉(zhuǎn)原碼,符號位不參與運算
取反后 + 1 == 取反前 – 1
科學計數(shù)法表示
1.8 * 10^11 –> 1.8E11
9.34 * 10^-3 –> 9.34E-3
相關(guān)細節(jié)
sizeof()是一個運算,而非函數(shù)
++運算不能用在實數(shù)上
判斷一個整數(shù)是否是2^n(2,4,6,8,16…)
!(x & (x – 1))
三目條件運算符代碼更優(yōu)
編譯器能產(chǎn)生比if…else…更優(yōu)的代碼
運算符優(yōu)先級、結(jié)合方向規(guī)則
單目 > 雙目
算術(shù) > 關(guān)系 > 位 > 邏輯 > 條件(三目)> 賦值 > 逗號
算術(shù): + – * /
關(guān)系: > < >= <=
位: & | ^
單目: ~
邏輯: && ||
單目: !
自右向左的三種運算符
單目
賦值
條件
數(shù)據(jù)輸入與輸出
printf()語句從右向左計算輸出表達式的值
i?=?1;??printf("%d,?%d\\\\n",?i++,?i--);??//res:?0,1
//先執(zhí)行i--,再執(zhí)行i++
常用輸出函數(shù)
printf()
putchar()
輸出一個字符
必須是字符型變量或常量
puts()
輸出一個字符串
必須是字符串或常量
常用輸入函數(shù)
scanf()
gets()
每次讀取一個字符串
getche()
conio.h中
讀取字符不用按回車
getchar()
stdio.h中
完成后須按回車
getche() & getchar():
每次讀取一個字符
scanf() & gets()區(qū)別:
scanf不能輸入含空格字符串,gets可以
二、選擇語句和循環(huán)語句
switch:case 常量表達式
常量表達式只能為整型、字符型
不允許浮點型
三、數(shù)組
定義
定義數(shù)組未賦初值
Turbo C會給數(shù)組置0
VC則取隨機值
定義靜態(tài)數(shù)組,則系統(tǒng)自動賦0
比較字符串數(shù)組中的值
C: strcmp(str1,str2)
C++: str1 == str2
JAVA: str1.equals(str2)
java中,str1 == str2 比較的是地址
四、指針
指針運算
指針相減:表示兩指針所指地址之間的數(shù)據(jù)個數(shù)
指針相加:沒有意義,錯誤
數(shù)組與指針
1、一維數(shù)組首地址
int?a[10],?*p;p?=?&a[0];p?=?a
//等價,將數(shù)組首元素的首地址賦給指針p
表示:&a[0], a: 數(shù)組首元素的首地址
&a: 數(shù)組首地址
對比:
a?==?&a[0]
a?!=?&a //地址值相同,含義不同
2、二維數(shù)組首地址
int?a[10][10];
地址值相同,含義不同:
a:
二維數(shù)組首元素首地址
代表一維數(shù)組元素的首地址
&a:
數(shù)組首地址
&a[0]:
二維數(shù)組首元素首地址
&a[0][0]:
&a[0][0] != a
a[0] == &a[0][0]
3、二維數(shù)組指針
int (*p)[3]:
指向含3個元素的二維數(shù)組的行指針
數(shù)組每列有3個元素
int \p[3] & int \(p[3]):
指針數(shù)組,每個元素均是一個指針
指針與引用的區(qū)別
非空區(qū)別
不能使用指向空值的引用
不存在指向空值的引用
效率比使用指針高
引用必須總是指向某些對象
指針可以指向空值
合法性區(qū)別
使用引用前,無需測試其合法性
使用指針總是需要判空
可修改區(qū)別
總指向初始化時被指定的對象
以后都不能改變
但指定對象的內(nèi)容可以改變
指針可被重新賦值,以指向另一對象
引用
應(yīng)用區(qū)別
指向一個對象后就不會改變指向的情況
存在不指向任何對象的情況
不同的時刻指向不同對象的情況
指針場景
引用場景
ps:聲明引用 / const常量 的同時,必須初始化
函數(shù)指針
float(**def)[10];
二級指針
指向一個一維數(shù)組的指針
數(shù)組元素都是float
double\(\gh)[10];
指針gh,指向一個一維數(shù)組
該數(shù)組元素的類型均為double *
double(*f[10])();
沒有參數(shù)
返回double類型的值
元素都是函數(shù)指針
f是一個數(shù)組,含10個元素
指向的函數(shù)
int \( (\b)[10] );
和int \(\b)[10]一樣
Long (* fun)(int)
函數(shù)指針
五、類型轉(zhuǎn)換
(int &)相關(guān)
float a = 1.0f;
(int)a實際上是以浮點數(shù)a為參數(shù)構(gòu)造了一個整型數(shù),該整數(shù)的值是1。
(int&)a則是告訴編譯器將a當作整數(shù)看(并沒有做任何實質(zhì)上的轉(zhuǎn)換)。
unsigned int
unsigned int a = 0xFFFFFFF7;
unsigned char i = (unsigned char)a;
i: 000000f7
char \b = (char?)&a;
*b: fffffff7
隱式類型轉(zhuǎn)換
算術(shù)運算式中,低類型能夠轉(zhuǎn)換為高類型
賦值運算式
右邊表達式的值自動隱式轉(zhuǎn)換為左邊變量的類型,并賦值給他
函數(shù)調(diào)用中參數(shù)傳遞時,系統(tǒng)隱式地將實參轉(zhuǎn)換為形參的類型后,賦給形參
函數(shù)有返回值時,系統(tǒng)將隱式地將返回表達式類型轉(zhuǎn)換為返回值類型,賦值給調(diào)用函數(shù)
六、位運算相關(guān)
取兩數(shù)的平均值:
(x?&?y)?+?[(x?^?y)?>>?1]
另類取兩數(shù)較大值:
max?=?[(a?+?b)?+?abs(a?-?b)]?/?2
三數(shù)取中間數(shù):
t1?=?max(a,?b);
t2?=?max(b,?c);
t3?=?max(a,?c);min(?t1,?min(t2,?t3)?)
七、函數(shù)
靜態(tài)函數(shù):不可被其他文件調(diào)用的函數(shù)
函數(shù)重載:
參數(shù)類型不同
參數(shù)個數(shù)不同
對返回類型沒有要求
八、#define & const & sizeof
#define實例
*?#define?SEC?(60?*?60?*?24?*?365)UL*?#define?MIIN(A,?B)????(?(A)?<=?(B)???(A)?:?(B)?)
const,#define的區(qū)別
const
有數(shù)據(jù)類型
可進行類型安全檢查
可對其進行調(diào)試
\#define
沒有數(shù)據(jù)類型
僅進行字符替換,沒有類型安全檢查
無法調(diào)試
c中const
被當做一個不能被改變的普通變量
error
const?bufsize?=?100;char?buf[bufsize];
字節(jié)對齊
數(shù)據(jù)對齊規(guī)則
結(jié)構(gòu)的首地址必須是結(jié)構(gòu)內(nèi)最寬類型的整數(shù)倍地址
結(jié)構(gòu)體的每一個成員起始地址必須是自身類型大小的整數(shù)倍
結(jié)構(gòu)體的整體大小必須可被對齊值整除
結(jié)構(gòu)體的整體大小必須可被本結(jié)構(gòu)內(nèi)的最寬類型整除
sizeof
結(jié)構(gòu)體或類內(nèi)的靜態(tài)變量
struct?s{??int?a;??static?int?b;
};
s?ss;sizeof(ss)
結(jié)果:4
靜態(tài)變量存放在全局數(shù)據(jù)區(qū)
sizeof計算棧中分配的大小
任何類型指針大小相同:4(32位)
對函數(shù)使用sizeof
在編譯階段會被函數(shù)返回值的類型取代
空類大小
單繼承:1
多繼承:1
虛繼承:4
涉及虛表(虛指針)
內(nèi)聯(lián)函數(shù) vs. 宏
內(nèi)聯(lián)
相比普通函數(shù): 加快程序運行速度
直接嵌入目標代碼
要做參數(shù)類型檢查
宏
簡單的替換
不做參數(shù)類型檢查
九、 C++面向?qū)ο?/b>
1、類和對象
類對象的存儲空間
只為每個對象的數(shù)據(jù)成員和函數(shù)地址分配內(nèi)存空間
類中所有成員函數(shù)只生成一個副本
該類每個對象執(zhí)行相同的函數(shù)成員
拷貝構(gòu)造函數(shù)
功能
用一個已知的對象來初始化一個被創(chuàng)建的同類的對象
特點
函數(shù)只有一個參數(shù),并且是對某個對象的引用
每個類都必須有一個拷貝初始化構(gòu)造函數(shù)
格式
類名::拷貝初始化構(gòu)造函數(shù)名(const 類名 &引用名)
靜態(tài)成員
靜態(tài)數(shù)據(jù)成員
類名::靜態(tài)數(shù)據(jù)成員名
類的所有對象共享
必須初始化,且要在類外初始化
特點
引用格式
靜態(tài)成員函數(shù)
類名::靜態(tài)成員函數(shù)名
類的所有對象共享
只能使用類的靜態(tài)成員和非數(shù)據(jù)成員
特點
引用格式
類成員指針
const成員函數(shù)
定義:任何不修改成員數(shù)據(jù)的函數(shù)都應(yīng)聲明為const函數(shù)
原型:int GetY() const;
細節(jié):
const函數(shù)想修改成員變量
在相應(yīng)變量定義處加上mutable
mutable int m_Count;
2、友元函數(shù)
定義
需在類體內(nèi)聲明
可訪問類的私有成員
不是類的成員函數(shù)
優(yōu)點:提高程序運行效率
缺點:破壞類的封裝性和隱藏性
特點:可以是多個類的友元
3、繼承和派生
公有繼承
派生類成員函數(shù)可訪問基類中的公有成員和保護成員
派生類的對象僅可訪問基類中的公有成員
派生類
構(gòu)造函數(shù)執(zhí)行順序
基類構(gòu)造函數(shù)
子對象類的構(gòu)造函數(shù)(如果有的話)
派生類構(gòu)造函數(shù)
析構(gòu)函數(shù)執(zhí)行順序
派生類的析構(gòu)函數(shù)
基類的析構(gòu)函數(shù)
虛基類
小編推薦一個學C語言/C++的學習裙【 六二七,零一二,四六四 】,無論你是大牛還是小白,是想轉(zhuǎn)行還是想入行都可以來了解一起進步一起學習!裙內(nèi)有開發(fā)工具,很多干貨和技術(shù)資料分享!