seek a firm footing in the depths.
在深處尋求穩(wěn)固的立足點(diǎn)
入門篇
變量聲明及初始化
short a = 32768;
內(nèi)存分配的存儲(chǔ)空間為2字節(jié)唠叛,取值范圍:-32768~32767或辖,所以會(huì)出現(xiàn)溢出,最后輸出-32768
2個(gè)字節(jié)较店,每個(gè)字節(jié)8位祈秕,2^16=65536唯蝶,所以u(píng)nsigned short取值范圍為0~65535。
指數(shù)
在用指數(shù)形式表示時(shí)详瑞,在e之前的部分稱為尾數(shù)部分(默認(rèn)符號(hào)是正號(hào))掂林,在e之后的稱為指數(shù)部分。例:0.000342的指數(shù)形式為3.42E-4
整型運(yùn)算
小數(shù)賦值給整型變量:小數(shù)將被截?cái)酁檎麛?shù)坝橡。
整數(shù)除法結(jié)果為整數(shù)泻帮,余數(shù)被丟棄。
求模運(yùn)算符%返回整數(shù)除法的余數(shù)计寇。余數(shù)的符號(hào)總是與被除數(shù)相同锣杂。
例:-5%2結(jié)果為-1,5%-2結(jié)果為1番宁。
只要有一個(gè)操作數(shù)為浮點(diǎn)數(shù)變量或浮點(diǎn)數(shù)字面量元莫,就執(zhí)行浮點(diǎn)數(shù)除法;要將整形數(shù)先轉(zhuǎn)換為浮點(diǎn)數(shù),然后再運(yùn)算蝶押。
閏年:
判斷標(biāo)準(zhǔn)是:1柒竞、能整除4且不能整除100 2、能整除400
嚴(yán)格上講"每4年一個(gè)閏年"這說(shuō)法不嚴(yán)謹(jǐn)播聪。應(yīng)該是四年一閏朽基,百年不閏,四百年再閏离陶。
- 產(chǎn)生閏年原因:地球繞太陽(yáng)運(yùn)行周期為365天5小時(shí)48分46秒(合365.24219天)即一回歸年(tropical year)稼虎。公歷的平年只有365日,比回歸年短約0.2422 日招刨,所余下的時(shí)間約為四年累計(jì)一天霎俩,故四年于2月加1天,使當(dāng)年的歷年長(zhǎng)度為366日沉眶,這一年就為閏年打却。
- 但是,上面算法又有了一個(gè)問(wèn)題谎倔。就是0.2422*4=0.9688柳击,比一天還差0.0322天,每4年差0.0322天不算多片习,但每400年就會(huì)差了約3天捌肴。即是說(shuō)蹬叭,假如每4年一個(gè)閏年,那么每400年就會(huì)有100個(gè)閏年状知,然后會(huì)多算了3天秽五。
- 所以,就規(guī)定了每四百年中要減少三個(gè)閏年饥悴。公歷年份是整百數(shù)的坦喘,必須是400的倍數(shù)的才是閏年,不是400的倍數(shù)的,雖然是100的倍數(shù),也是平年西设。
跳轉(zhuǎn)
從函數(shù)返回一個(gè)值:使用return返回調(diào)用函數(shù)語(yǔ)句處
break直接終止循環(huán)起宽,不等待條件為false
continue跳過(guò)余下的語(yǔ)句,開始下一次循環(huán)迭代济榨。
循環(huán)
無(wú)限循環(huán)while(true)
設(shè)置計(jì)數(shù)器變量、檢查計(jì)數(shù)器變量是否滿足條件绿映,并在每次循環(huán)迭代中修改該變量
while循環(huán)擒滑、for循環(huán)(循環(huán)固定的次數(shù))
數(shù)組和內(nèi)存簡(jiǎn)介:
聲明數(shù)組時(shí),編譯器會(huì)根據(jù)數(shù)據(jù)類型和元素?cái)?shù)為數(shù)組預(yù)留合適的內(nèi)存量(內(nèi)存地址連續(xù))叉弦。數(shù)組適合用于存儲(chǔ)項(xiàng)數(shù)已知的數(shù)據(jù)丐一,預(yù)先不知道有多少個(gè)元素,必須使用更高級(jí)的數(shù)據(jù)結(jié)構(gòu)淹冰。
int box[2][3] = {
{1,2,3},
{4,5,6}};
字符數(shù)組
字符串是以空字符結(jié)尾的字符數(shù)組库车,空字符是編碼為'\0'的特殊字符。
字符數(shù)組:char yum[] = "Zombie Eat Brains"; //編譯器自動(dòng)添加空字符
數(shù)組長(zhǎng)度:sizeof(yum)/sizeof(yum[0])
未初始化的字符數(shù)組稱為緩沖區(qū)樱拴。
防止數(shù)組越界(程序bug和安全問(wèn)題)和輸入空格就結(jié)束的問(wèn)題:std::cin.getline(yum,18,' ');
最多讀取18字符(緩沖區(qū)能存儲(chǔ)的字符減一)柠衍,以空格作為結(jié)束標(biāo)志(默認(rèn)為換行符'\n')
注意:
惡意程序員利用最多的漏洞是:寫入數(shù)據(jù)時(shí)超越緩沖區(qū)邊界,利用這種錯(cuò)誤來(lái)執(zhí)行新代碼晶乔,新代碼可執(zhí)行任意操作珍坊,如:修改刪除文件,將系統(tǒng)特權(quán)授予不受信任的用戶及復(fù)制病毒正罢。
任何沒(méi)有賦值的數(shù)組元素阵漏,其值為相應(yīng)內(nèi)存中原有的值,使用未賦值的元素的結(jié)果是無(wú)法預(yù)測(cè)的翻具。
合并數(shù)組:指針履怯,字符串使用內(nèi)置函數(shù)(strcat)
問(wèn)題:C++類中數(shù)據(jù)成員為類類型時(shí),定義為對(duì)象還是定義為指針裆泳?
C++中叹洲,ClassTest objTest;就已經(jīng)構(gòu)造了對(duì)象,分配了空間工禾;而在C#,Java中ClassTest objTest;只是聲明疹味,并沒(méi)有分配空間仅叫。
在C++中,ClassTest objTest;是在棧上分配空間糙捺,ClassTest *pobjTest = new ClassTest;是在堆上分配空間诫咱。
棧分配的空間自動(dòng)回收,堆分配的空間需要手動(dòng)回收洪灯。
在一個(gè)類中定義指向另外一個(gè)類的指針:
class A {
public:
A();
~A();
B *pt; //直接定義就好坎缭,但是記得要包含類B 的頭文件
}
pt = new B; //分配動(dòng)態(tài)內(nèi)存
用完別忘記delete掉,可以在A的析構(gòu)函數(shù)中做這個(gè)事情
類的對(duì)象可以作為另一個(gè)類的數(shù)據(jù)成員, 在定義類時(shí), 與普通的數(shù)據(jù)成員一樣, 在聲明時(shí)無(wú)法進(jìn)行初始化,(構(gòu)造函數(shù)作用签钩,避免混亂)
情況1:
當(dāng)B類中的數(shù)據(jù)成員全部為 public 時(shí), 可以在A類的構(gòu)造函數(shù)內(nèi)完成初始化掏呼。
由于B類中的數(shù)據(jù)成員全為 public 的, 所以可以通過(guò) 對(duì)象名.數(shù)據(jù)成員名 的方式直接進(jìn)行訪問(wèn)。
情況2:
要在A類中對(duì)B的 private 數(shù)據(jù)成員進(jìn)行正常的初始化同樣需要借助初始化表達(dá)式來(lái)完成
Line(int x1, int y1, int x2, int y2):M(10, 20), N(100, 200) { ; }