易被遺忘的9個C/C++要點今天幫你總結(jié)了~

一、 數(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ù)資料分享!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy閱讀 9,672評論 1 51
  • 一、 數(shù)據(jù)類型及運算 求補碼 原碼的基礎(chǔ)上, 符號位不變, 其余各位取反, 最后+1 原碼轉(zhuǎn)補碼不考慮符號位 補碼...
    rh_Jameson閱讀 7,623評論 6 42
  • 1.面向?qū)ο蟮某绦蛟O(shè)計思想是什么? 答:把數(shù)據(jù)結(jié)構(gòu)和對數(shù)據(jù)結(jié)構(gòu)進行操作的方法封裝形成一個個的對象。 2.什么是類?...
    少帥yangjie閱讀 5,124評論 0 14
  • 最近一直有問題困擾著自己, 從未有過的這種壓迫感。 我怎么把人與人之間的關(guān)系處成了 如此不堪的樣子? 也許自己一直...
    Britney_Spring閱讀 275評論 0 0
  • 某天一大早,我正坐著,阿卿進來了:“哇靠,我昨天拿著學生證和我女朋友去城墻買學生票,結(jié)果當場被識破!” “那肯定嘛...
    別離的回憶閱讀 708評論 0 1

友情鏈接更多精彩內(nèi)容