目錄
"實用性"增加
register 關鍵字增強
變數檢測的增強
struct型別加強
對資料型別檢查的增強
新增bool型別關鍵字
總體**
在c語言中,變數需要提前定義,如果出現一條語句,再補充定義一條變數,就會報錯。如:
#include "iostream"
using namespace std;
//c語言中的變數都必須在作用域開始的位置定義!!
//c++中更強調語言的「實用性」,所有的變數都可以在需要使用時再定義。
int main11()
變數k沒有提前定義,而是在執行中間定義的,就會報錯。當然,這種問題是針對於編譯器的,如果是用c的編譯器,就會報錯,如果是用c++的編譯器,就不會報錯了。
register關鍵字的作用(在c語言中)是請求編譯器讓變數a直接放在暫存器裡面執行(暫存器是沒法取位址的,如取位址的話,就會在c編譯器中會報錯),這樣做可以使程式執行速度快。
如下**,在c編譯器上就不能通過,而在c++編譯器上就可以通過:
void main42()
這是因為:
1. register關鍵字請求「編譯器」將區域性變數儲存於暫存器中,c語言中無法取得register變數位址,在c++中依然支援register關鍵字,但c++編譯器有自己的優化方式,不使用register也可以會做優化,同時,c++中是可以取得register變數的位址的。這句話應該這麼理解:如下:
for (int i=0; i<1000; i++) //不使用register也可能做優化
像這種頻繁使用變數i的時候,c++會自動對i進行優化,加快程式的執行速度。意思說,即使不定義關鍵字,c++編譯器也能根據情況,來進行優化。
2. c++編譯器發現程式中需要取register變數的位址時,register對變數的宣告變得無效。
3. 早期c語言編譯器不會對**進行優化,因此register變數是乙個很好的補充。
先看個例子:
int g_a = 100;
//int g_a ;
void main()
可以看出,這段**明顯是錯誤的,但在c編譯器下,是可以執行的,而在c++編譯器中是不可以被執行的,可以被檢查出來,這就是所謂的變數檢查的增強。
在c語言中,重複定義多個同名的全域性變數是合法的,在c++中,不允許定義多個同名的全域性變數,c語言中多個同名的全域性變數最終會被鏈結到全域性資料區的同乙個位址空間上。如下乙個例子:
int g_var;
int g_var = 1;
c++會直接拒絕這種二義性的做法。
c語言的struct定義了一組變數的集合,c編譯器並不認為這是一種新的型別。
c++中的struct是乙個新型別的定義宣告。
struct teacher
;void main51()
c++中,struct 關鍵字和class關鍵字所完成的功能是一樣的 。但它倆還是有區別的,以後講到。
c++中所有的變數和函式都必須有型別,即c++對型別的檢查將更加嚴格。
比如說,在c語言裡面,可以寫:
f(i)
根本就不知道i是個什麼型別,就能讓列印出來了!
g()
函式內啥都沒有, 就能直接返回輸出乙個5。 這些都是c語言中的"灰色地帶",這也是c語言不好的地方,c++對這些進行了摒棄和優化。
c++中所有的變數和函式都必須有型別,c語言中的預設型別在c++中是不合法的!
在c語言中就用不了,是c++新增的資料型別。
測試下bool型別所占用的記憶體空間:
bool b1 = true; //告訴c++編譯器給我分配 1個位元組的記憶體
cout<<"sizeof(bool)"《所占用的記憶體空間是1個位元組。
c++中的bool可取的值只有true和false,理論上bool只占用乙個位元組,如果多個bool變數定義在一起,可能會各佔乙個bit,這取決於編譯器的實現。
true代表真值,編譯器內部用1來表示
false代表非真值,編譯器內部用0來表示
bool型別只有true(非0)和false(0)兩個值
c++編譯器會在賦值時將非0值轉換為true,0值轉換為false
dm04_實用性增強_register_型別檢查.cpp
#include using namespace std;
//c語言中的變數都必須在作用域開始的位置定義!!
//c++中更強調語言的「實用性」,所有的變數都可以在需要使用時再定義。
void main41()
void main42()
system("pause");}/*
在c語言中,重複定義多個同名的全域性變數是合法的
在c++中,不允許定義多個同名的全域性變數
int g_var;
int g_var = 1;
c++直接拒絕這種二義性的做法。
*/int g_a = 100;
//int g_a ;
void main()
dm05_struct型別加強.cpp
#include using namespace std;
//struct 關鍵字 class關鍵字 完成的功能是一樣的
//區別後面介紹 拋磚
class c1
;struct teacher
;void main51()
/*c++中所有的變數和函式都必須有型別
c語言中的預設型別在c++中是不合法的
函式f的返回值是什麼型別,引數又是什麼型別?
函式g可以接受多少個引數?
*//*
//更換成.cpp試試
f(i)
g()int main(int argc, char *ar**)
*/
dm06_bool型別.cpp
#include using namespace std;
void main()
C 對C的擴充套件
1.c 會對函式返回值型別和引數個數進行檢測 c語言預設為返回值為int,引數個數不做檢查 2.c 在定義結構體變數時,關鍵字struct可以省略,結構體名不能省 3.在全域性中定義 int val g bss段 全是0 在全域性中 int val g 20 data c正確 2是賦值 c 錯誤 重...
C 對C的擴充套件
c 是c語言的加強,是一種更好的c語言 c 是以c語言為基礎的,並且完全相容c語言的特性 c語言 物件導向方 objective c c c 以c語言為基礎 物件導向支援 型別加強 函式加強 異常處理 標準格式 namespace namec中的命名空間 在c語言中只有乙個全域性作用域 c語言中所有...
c 對c的擴充套件
1 c 對型別檢查比c語言更為嚴格。如 demo1.c char p malloc 100 c語言可以通過,c 報錯 char p char malloc 100 正確 demo2.c const int a 100 int p a c語言警告,c 直接報錯 const int p a 正確 dem...