區別在於#define 不必定義該常量屬於什麼型別,是int,還是long int,而const定義的常量必須指明型別,至於哪種定義常量的方法好?我們推薦使用第二種,至於為什麼,後面會說,我們現在主要來討論c++如何確定常量的型別,假設我們就使用#define定義了 max = 123456789怎麼乙個常量,那麼c++會如何確定常量型別呢?
#define max 12456789
std::cout <<
sizeof
(max)
<< std::endl;
來看執行結果:
結果是4,說明c++將max儲存為int型別。
如果我們把這個數變一下:
#define max 36456465ll
std::cout <<
sizeof
(max)
<< std::endl;
執行結果:
我們將max 後面加了兩個ll,還記得ll表示什麼嗎?對,表示的是long long型別。
下面的結論是需要記住的:在c++中將使用這幾種型別中能夠儲存該數的最小型別來表示,前提是該數後面沒有字尾,如果有字尾,則按字尾指定的型別來儲存,至於浮點數呢,c++規定過只要不加f字尾的浮點數預設都為double,所以想要將浮點數儲存為float,就需要特別的加上字尾f,這是和整形的不同。
以上說的都是對於十進位制的儲存方式,而對於八進位制或者是十六進製制,它們的儲存方式為int,unsigned int,long,unsigned long,long long或者是unsigned long long。至於為什麼會使用無符號的型別來儲存,這是因為十六進製制常用來表示記憶體位址,記憶體位址是沒有符號的,因此unsigned int 比 long更適合來表示十六位的位址。
下面來說說const,const除了上面的用法,也就是定義常量,用const修飾變數時,一定要在初始化的時候進行賦值,否則之後是無法賦值的。
還有一些其他的用法,當然,如果你剛接觸到上面的內容,這個可以跳過。
常量指標:
int number =
666;
const
int* p =
&a;// int const * p 這種方法和上面等效,這個指標被修飾為常量指標,就是不可以通過這個指標修改變數的值。
number =66;
//但是可以通過number修改,也就是間接修改了指標指向的變數。
// 並且需要注意的一點是雖然不可以通過這個指標修改變數的值,但是可以修改指標所指向的變數,也就是說下面是合法的。
int number_2 =1;
p =&number_2;
就好比我有一台電腦,裝的是xp系統,有一天鄰居小姐姐想跟我借電腦用一下,但是她覺得xp系統老掉牙了,想重灌為win10系統,這時我就告訴她,不可以,重灌只有我可以,這是我的電腦,她雖然不能給我的電腦重灌系統,但是它可以選擇跟其他人借用有win10系統的電腦。這就是常量指標,對應的還有一種指標常量,往下看。
指標常量:
int number =
666;
int*
const p =
&number;
// 千萬不要寫出 const * int p,這是錯誤的寫法。
// 指標常量指向的位址不能改變,但是位址中儲存的數值是可以改變的。
*p =
6; // 可以
int number2 =
6;p =
&number2; // 不可以
除了以上兩種,還有一種結合了上面兩種,叫做指向常量的長指標。
int number =
666;
const
int*
const p =
&number;
// p既不能改變指向位址,也不能改變值,這個屬於它們三個中的大哥。
還有就是如果給函式的返回值修飾了const,則接收返回值的變數型別也必須同樣被const修飾。
長話短說,如果要表示中文,顯然乙個位元組是不夠的,至少需要兩個位元組,而且還不能和ascii編碼衝突,所以,中國制定了gb2312編碼,用來把中文編進去,類似的,日文和韓文等其他語言也有這個問題。為了統一所有文字的編碼,unicode應運而生。unicode把所有語言都統一到一套編碼裡,這樣就不會再有亂碼問題了。。unicode通常用兩個位元組表示乙個字元,原有的英文編碼從單位元組變成雙位元組,只需要把高位元組全部填為0就可以。想要深入了解請單擊
通用字元名類似於轉義字元,使用\u和\u打頭,\u然後跟乙個八進位制,\u後面跟的是十六進製制,可以這樣用:
int k\u0025d;
// 這樣定義變數名
cout <<
"\u0025"
;// 列印該字元
這樣就可以在控制台列印出我們想要字元,比如各種圖案。但是前提是要支援通用字元名,如果不支援,就會提示
一般黑框框是顯示不了特殊字元的,給大家找到乙個中文轉unicode的**:中文字元與unicode字元相互轉換
當使用\u6211列印出來的便是我:
char的有無符號和int不太一樣,它比較獨特,char在預設情況下不像int那樣,預設既不是unsigned char也不是signed char,是否有符號由c++決定,在我的編譯器上可能是有符號型別的,你的終端可能是無符號型別,如果你不確定char,則應該盡可能的顯式去宣告是nusigned 還是signed,如果你只是儲存ascii字元,則無關char是什麼型別,它都可以儲存。
ansi/iso c++標準新增了一種名叫bool的新型別,它只佔乙個位元組,只儲存true和false這個已經巨集定義好的字面值,只有假和真兩種表現方式,有些人一聽到真假就想到01,一想到01就認為該型別的變數只能儲存0或1,其實這種理解是不對的,該變數只儲存true和false這兩個值,並不是儲存0和1,除了0被替換為false之外,所有的數字,1,5,8等等都會被替換為true,包括負數,同樣反過來,將bool型別的變數賦值給int型別的變數,只會出現0和1這兩個值。
bool b1 =
true
// 正確
bool b2 =
4; //正確,但4會被替換為1
int a = b2; // a的值為1,而不是4,也不是true
簡單來說先考慮優先順序,再考慮結合性。
當兩個運算子的優先順序是一樣的話,要使用結合性進行判斷:
例如:
int a =10*
5/6;//由於/ 和*的優先順序是一樣的,這時候就應該用結合性判斷是從左往右算,還是從右往左算。
C 的基本型別
在數學中,整數和分數統稱為有理數,無限不迴圈小數和開根開不盡的數統稱為無理數,而有理數和無理數統稱為實數。在計算機中,處理的物件是資料。為了描述不同的物件而需要不同的資料,因此,c 語言提供了豐富的資料型別。c 的資料型別主要包括基本資料型別和構造資料型別。其中基資料本型別包括整型 浮點型 字元型 ...
C 及變數基本型別知識總結
c 標準規定了每個算算術型別的最小儲存空間,但是並不阻止編譯器使用更大的儲存空間。整形中的問題 c 標準並未規定signed型別如何用位來表示,而是由編譯器自由決定如何表示signed型別。當我們把乙個超出型別表示範圍的值賦值給指定型別的物件時 最終的取值取決於這種型別是signed還是unsign...
(四十二)C 的基本型別(總結)
基本型別有兩組,整型和浮點型別。整型從小到大排列 bool char signed char unsigned char short unsigned short int unsigned int long unsigned long,以及c 11新增的long long和unsigned long...