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只是個唯讀變數,本質上還是變數,有儲存空間,定義陣列長度用變數當然會出錯了。但...