C到C 的公升級

2021-06-18 03:26:01 字數 4132 閱讀 7313

c與c++的關係

1.c++繼承了所有的c特性

2.c++在c的基礎上提供了更多的語法和特性

3.c++的設計目標是執行效率與開發效率的統一

c++對c的加強

1.c++中更強調語言的「實用性」,所有的變數都可以在需要使用的時候再定義

for(int i=0; i<10; i++)

//c++編譯器不報錯

}注意:c語言中的變數都必須在作用域開始的位置定義!!

2.register關鍵字的變化

.register關鍵字請求「編譯器」將區域性變數儲存於暫存器中

c語言中無法取得register變數位址

在c++中依然支援register關鍵字

c++編譯器有自己的優化方式,不使用register也可能做優化

c++中可以取得register變數的位址 

c++編譯器發現程式中需要取register變數的位址時,register對變數的宣告變的無效,變數會退化為普通變數

早期c語言編譯器不會對**進行優化,因此register變數是乙個很好的補充

register int c = 0;

printf("&c = %08x\n",&c);   // c編譯器會報錯:address of register variable 'c' requested;

//c++編譯器不報錯

3.c語言中重複定義多個同名的全域性變數是合法的

c++中不允許定義多個同名的全域性變數

c++直接拒絕這種二義性的做法

int g_var;

int g_var = 1;     //c編譯器不報錯

//c++編譯器報錯: 'int g_var' previously declared here

4.c++編譯器對const常量的處理(c語言中const宣告的是唯讀變數,c++中const宣告的是常量)

當碰見常量宣告時在符號表中放入常量

編譯過程中若發現使用常量則直接以符號表中的值替換

編譯過程中若發現對const使用了extern或者&操作符,才會給對應的常量分配儲存空間

注意:c++編譯器雖然可能為const常量分配空間,但不會使用其儲存空間中的值,而是用符號表中的值

const int c = 0;

int* p = (int*)&c;

*p = 5;

printf("c = %d\n",c);    //c編譯執行輸出5,c++編譯執行輸出0

c語言中的const變數

c語言中const變數是唯讀變數,有自己的儲存空間

c++中的const常量

可能分配儲存空間

.當const常量為全域性,並且需要在其它檔案中使用(extern)

.當使用&操作符取const常量的位址

const int a = 1;

const int b = 2;

int array[a + b] = ;  //c編譯器報錯: variable-sized object may not be initialized,因為a,b是區域性變數,其值在執行時才確定,編譯過程中c編譯器不會知道a,b具體的值,

//故編譯器沒法知道陣列大小所以報錯

//c++編譯器不報錯,發現a,b是常量,放入符號表,到這一步直接到常量表把a,b的值取出來相加

c++中的const小結

.c++中const常量類似於巨集定義

const int c = 5;  ≈ #define c  5

.c++中的const常量與巨集定義不同

.const常量是由編譯器處理的,提供型別檢查和作用域檢查

.巨集定義由預處理器處理,單純的文字替換

void f()

void g()

5.struct型別的加強:

.c語言的struct定義了一組變數的集合,c編譯器並不認為這是一種新的型別

.c++中的struct是乙個新型別的定義宣告

struct student

;int main(int argc, char *argv)

;    //c編譯器報錯:unknown type name 'student',c編譯器不認為定義了新型別,只認為上面定義了乙個變數的集合

student s2 = ;     //c++編譯器不報錯

...}

6.c++中所有的變數和函式都必須有型別

c語言中的預設型別在c++中是不合法的

f(i)     //c語言中等價於int f(int i),c++中報錯

g()     //c語言中等價於int g(),c++中報錯

int main(int argc, char *argv)

//c編譯器編譯執行通過

7.int f(); 與int f(void); 區別

在c語言中

int f();表示返回值為int,接受任意引數的函式

int f(void);表示返回值為int的無參函式

在c++中

int f();和int f(void);具有相同的意義,都表示返回值為int的無參函式

8.c++中的布林型別 

c++在c語言的基本型別系統之上增加了bool

c++中的bool可取的值只有true和false

理論上bool只占用乙個位元組,如果多個bool變數定義在一起,可能會各佔乙個bit,這取決於編譯器的實現

tip:true代表真值,編譯器內部用1來標示

false代表非真值,編譯器內部用0來標示

bool型別只有true(非0)和false(0)兩個值

c++編譯器會在賦值時將非0值轉換為true,0值轉換為false

例:  

int a;

bool b = true;  

printf("b = %d, sizeof(b) = %d\n",b,sizeof(b)); 

b = 3;

a = b;   

printf("a = %d, b = %d\n",a,b);  

b = -5;

a = b;   

printf("a = %d, b = %d\n",a,b);  

a = 10;

b = a;  

printf("a = %d, b = %d\n",a,b);   

b = 0;   

printf("b = %d\n",b);     //結果如下:

例:bool型別變數參與數**算

bool b = false;   

printf("b = %d\n",b);

b++;  

printf("b = %d\n",b);

b = b + 1;   

printf("b = %d\n",b);  //輸出如下:

9.三目運算子的公升級

c語言中的三目運算子返回的是變數值,不能作為左值使用

c++中的三目運算子可直接返回變數本事,因此可以出現在程式的任何地方

int a = 1;

int b = 2;

(a < b ? a : b) = 3;     //c編譯器報錯,c++編譯器正常通過

printf("a = %d, b = %d\n", a,b);  //輸出:a = 3, b = 2

如果改為 (a < b ? 1 : b) = 3; 則c++編譯器也會報錯,因為

注意:三目運算子可能返回的值中如果有乙個是常量值,則不能作為左值使用 小結

c++以c語言為基礎進行了加強

.c++更強調實用性,可以在任意的地方宣告變數

.c++中的register只是乙個向後相容的作用,c++編譯器能夠進行更好的變數優化

.c++中的const是乙個真正意義上的常量,而不是唯讀變數

.c++更加強調型別,任意的程式元素都必須顯示指明型別

c到c 的公升級

c 繼承了c的所有特性,c 在c的基礎上同時增加了許多新的語法和特性,c 的目標是實現執行效率與開發效率相統一。c 中更加強調語言的實用性,所有變數可在使用的時候再定義。例如 include int main int argc,char argv printf c d n c printf end....

C到C 的公升級

c 的加強主要表現在 型別的加強 物件導向支援 1 變數定義 c 更強調語言的實用性,所有的變數都可以再需要使用的時候再定義,c語言中的變數都必須在作用域開始的位置定義 int c 0 for int i 1 i 3 i register 關鍵字請求編譯器將區域性變數儲存與暫存器中 早期的c語言編譯...

C到C 的公升級

即使分配了空間也不會用儲存空間裡面的內容,只會使用符號表的值。再舉個例子 1 constint a 10 2 constint b 20 3 int c a b 上面的 在c中會報錯 無法確定陣列長度 因為在c中const只是個唯讀變數,本質上還是變數,有儲存空間,定義陣列長度用變數當然會出錯了。但...