long和int一般有一樣的尺寸,如果你的數字式超過了int的表示範圍,選用long long
注意char在不同編譯器型別了可能不同,有時有符號,有時候預設無符號
執行浮點數最好用double.事實上,對於某些機器來說,雙精度運算甚至比單精度快。
long double提供的精度在一般情況下是沒有必要的,況且他的執行時耗也不容忽視
bool:非零即真()
bool ->(賦給)非bool(結果:false ->0;true->1)
非bool->(賦給)bool(結果:0->false;非零即真->true)
整數 -> 浮點型別 (結果:只保留小數點前的部分)
浮點型別 -> 整數 (結果:小數部分記為0,若該整數空間超過浮點型別,則精度有損)
賦給-> 無符號型別乙個超出其表示範圍時 (結果:是初始值對無符號型別表示在、數值總數取模後的餘數)
例如:可以編譯器自己測試一下:
1.當乙個算數表示式中既有無符號又有int型時,那個int值就會轉換為無符號數
注意:切記混用無符號和有符號型別
2.注意:當從乙個無符號數中減去乙個值時,不管這個值是不是無符號數,我們都必須確保結果不能是乙個負值
例如如下: 就陷入了乙個死迴圈!!!!可以用while來代替避免這種結果(要很清楚這兩者的執行過程)
for(unsigned i = 10;i>=0;--i)
cout初始化不是賦值,初始化的含義是建立變數時賦予其乙個初始值,而賦值的含義是吧物件的當前的值擦除,而已乙個新值來代替。
字面值常量:一眼能看見的值
注意 "a" 和 'a' 是不同的
物件:一塊能儲存資料並具有某種型別的記憶體空間
初始化 和 賦值 的區別?
初始化的含義是建立變數時賦予其乙個初始值,而賦值的含義是把物件的當前值擦除,而以乙個新值來代替
列表初始化 預設初始化?
內建型別初始化 :如果使用列表初始化且初始值存在丟失資訊的風險,則編譯器報錯
什麼是內建型別?
如果內建型別的變數未被顯示初始化,它的值由定義的位置決定。定義於任何函式體之外的變數被初始化為0;
定義在函式體內部的內建型別的量將不被初始化。未定義的,如果試圖拷貝或以其他形式訪問此型別值將引發錯誤。
2.變數宣告和定義的關係
宣告使得名字為程式所知;
定義負責建立與名字關聯的實體;定義還申請儲存空間,也可能會為變數付乙個初值
如果想宣告乙個變數而非定義它,就在變數名前加extern ;
任何包含了顯示初始化的宣告即成為定義,給由extern關鍵字標記的變數附乙個初始值,但這也抵消了extern的作用
變數能且只能被定義一次,但是可以被多次宣告
3.c++是一種靜態型別語言。其含義是在編譯階段檢查型別
4.識別符號
1.使用者自定義的識別符號中不能連續出現兩個下劃線;也不能以下劃線連著大寫字母;此外,定義在函式體外的識別符號不能以下劃線開頭;識別符號長度沒有限制;
2.變數命名規範:體現實際含義;一般用小寫字母;類名大寫字母開頭;多個單詞組成用下劃線連線
5.名字的作用域
1.同乙個名字在不同的作用域可能指向不同的實體。名字的有效區域始於名字的宣告語句
2.第一次使用時再定義它
3,作用域能彼此包含;允許在內層作用域中重新定義外層作用域已有的名字
如果函式有可能用到全域性變數,則不宜再定義乙個同名的區域性變數
6.復合型別
7.引用
1.一般是指左值引用,引用必須被初始化,引用型別的初始值必須是乙個物件(引用只能繫結到物件上,不能與字面值)
2.程式吧引用和他的初始值繫結在一起,而不是將初始值拷貝給引用
3.引用即別名 :引用並非物件,相反,他只是為乙個已經存在的物件所起的另外乙個名字
4.定義了乙個引用後,對其進行的所有操作都是在與之繫結的物件上進行的
8.指標:
指標本身就是乙個物件;無需在定義時賦初值;在快作用域內定義的指標如果沒有初始化,也將可能是不確定的值
指標存放的是物件的位址
指標四種狀態:
試圖拷貝或以其他方式訪問無效指標的值都將引發錯誤
利用指標訪問物件,修改*p的值就是修改p所指物件的值
空指標:可以直接給指標字面值為0來賦為空,也可直接賦為null,其實null的值就是為0,但不能直接給指標賦乙個變數, 哪怕是整型且值為0也不可
9.void*指標
1.可以存放任意物件的位址
2.不能直接操作void*指標所指的物件
3.以void*的視角來看記憶體空間也就僅僅是記憶體空間,沒辦法訪問記憶體空間中所存在的物件
10.理解復合型別的宣告
易錯點:int* p1,p2;//這會造成一種錯覺,好像這條語句中所有變數都是int*,其實int*僅僅修飾了p1,所有變數公用的只是int而已
指向指標的指標:二級指標
重要:引用本身不是乙個物件,因此不能定義指向引用的指標;但指標是物件,所以存在對指標的引用
int i = 42;
int *p;
int *&r = p;//*說明r引用的是乙個指標
r = &i;
*r = 0;
11.const限定符1.const物件一旦建立後其值就不能再改變,所以const物件必須初始化
2,const主要的限制就是只能在const型別的物件上執行不改變其內容的操作
1.指向常量的指標:同常量的引用類似:不能用於改變其所指物件的值 ;
int i= 5;
int const * p = &i;
2.指標的型別必須與其所指物件的型別一致,但有例外:允許零乙個指向常量的指標指向乙個非常量指標
(所謂指向常量的指標僅僅要求不能通過該指標改變物件的值,但沒有規定哪個物件的值不能通過其他路徑改變(這點同 常量的引用是一樣的 ))
2.const指標:
常量指標:
必須初始化,存放在指標中的位址就不能改變
例如:int i = 0;
int * const p = &i; //p將一直指向i
指標本身是乙個常量並不意味著不能通過指標修改其所指物件的值 ,取決於所指物件的型別
3.頂層const:
頂層const:表示指標本身是個常量,本身不可以被改變
底層const: 表示指標所指的物件是乙個常量(用於宣告引用的const都是底層const)
執行物件的拷貝操作時,常量是頂層還是底層區別明顯!!!
其中,頂層const不受什麼影響
如果我們把int的尺寸看做成是乙個確定不變的已知值,那麼這樣的程式就稱作是不可移植的
混合運算中的型別轉換問題:
如何學習C primer 第五版
c primer 第一次可以跳著看。關鍵是要盡快用起來,在使用中熟練,而不是在細節中迷失。以c primer第五版為例,第一遍讀的時候 part1也就是前七章,除了6.6,6.7節,都要通讀。尤其是第三章初步介紹了vector和string,簡直就是新手福音,搞定這兩個容器就能寫一些簡單的程式。pa...
c primer 第五版課後習題 第五章
第五章主要講了函式 include include include include using namespace std void test 5 9 std cout 母音字母個數為 t cnt endl void test 5 10 std cout 母音字母a的個數為 t cnt a endl...
C Primer第五版 第五章 程式設計題
5.9 編寫一段程式,使用一系列if語句統計從cin讀入的文字中有多少母音字母。include void main std cout a acnt std endl std cout e ecnt std endl std cout i icnt std endl std cout o ocnt s...