當前位置:
首頁 > 知識 > 從零開始學習C加加語言做C加加基礎學習筆記

從零開始學習C加加語言做C加加基礎學習筆記

本課主要說了C++中的變數聲明,關鍵字register和const,同時還有一部分C++對C的加強知識。


一、C++中變數的聲明和定義


1.C語言是源於操作系統的,主要注重於運行效率,而C++是C語言的加強,注重於運行效率和開發效率。

2.在C語言中,所有的變數都要求在作用域開始的時候定義,而C++可以在使用的時候再進行定義。在實際的開發中這將會提高很大的效率。



從零開始學習C加加語言做C加加基礎學習筆記



常式如下:

#include int main() { printf ("hello world
"); for (int i = 3; i


這段代碼在C++中可以正常的運行,在C環境中會報錯。


這種加強是十分合理的,假如我們在寫一個比較長的函數,那麼每次當我們想定義變數的時候我們都要到函數的開始位置去定義變數,這樣會很麻煩。現在有很多小夥伴在自學,但是一個人的能力總是有限的,遇到問題沒人幫你解決,我們有一個C++的學習交流群,搜索三四八中間是三九零最後是零九四。平時提供大家一起學習網頁設計,每天有免費C++課程知識講解。有問題相互交流。


二、C++中的register關鍵字


1.在C語言中,register關鍵字是用來修飾變數的,主要作用是用來請求編譯器將一個局部變數存儲在寄存器中,這是C的一個優化。當然,如果我們想要去獲得這個局部變數的地址是不能的(因為是寄存器地址,具體的看博客C語言中的關鍵字)。所以在C中,我們是不能夠對一個用register修飾的變數來使用&符號的。

2.在C++中,即使是register關鍵修飾的變數也仍然可以使用&符號來進行操作。


其實C++中的register關鍵字是對C語言的一個繼承,但是C++編譯器大部分都有自己的優化方式,即使不使用register修飾變數也可以進行優化。


在C++中使用&符號進行操作的時候,原來的register的意義就消失了。


3.常式:


#include int main() { for (int i = 0; i

程序在C++的環境下可以運行,運行結果如圖:



從零開始學習C加加語言做C加加基礎學習筆記



疑問:老師說C++編譯器可以將沒有聲明為register的變數放入寄存器,這裡面是不是還有很多機制呢?要不然是不是會很亂?

三、C++中全局變數的定義


1.在C中可以重複定義多個同名的全局變數,但是在C++中絕對不允許的。雖然這些全局變數被定義,其實編譯器只為它們開闢了一塊空間,實際上最後都是鏈接到同一塊地址空間上,也就是全局數據區。


常式:


#include int i = 1; int i = 1; int main(int argc, char *argv[]) { printf ("%d", i); printf("Press enter to continue ..."); getchar(); return 0; }


上述程序在C環境下會報錯,因為雖然我們定義了兩個全局變數,但是兩個全局變數並不可以都賦值(無論這兩個值是否相同)。所以C語言並不是說讓你可以隨心所欲的定義兩個值的。


上述代碼最好的改進方式是:


定義一個本段程序使用的全局變數int i,同時再定義一個供外部使用的變數extern int i。不過,不論是否加extern,這兩個全局變數都不可以同時賦值。


在C++中,是絕對不允許定義兩個同名的全局變數的。


四、C++中的const關鍵字


1.C語言中的const修飾的變數不是常量,即使一個變數使用const修飾過以後我們仍然可以改變這個變數的內容,也就是說C中的const仍然是一個變數。


常式:


#include int main(int argc, char *argv[]) { const int c = 0; int *p = (int*)&c; *p = 5; printf ("%d
", c); }


運行結果如下所示:



從零開始學習C加加語言做C加加基礎學習筆記



這裡我們首先取出const變數c的地址值賦給了p,然後再通過操作p來改變c中的值,最後我們改變了c中的值。


2.上面例子中同樣的代碼,在C++環境中運行的結果如下。



從零開始學習C加加語言做C加加基礎學習筆記



出現這樣的列印結果原因如下:在C語言中雖然我們定義了一個變數為const類型,但是C編譯器實際上還是給這個變數分配了空間,所以我們可以通過之後怎操作來改變這個地址裡面的值,因為有內存空間存在嘛。在C++中,編譯器不一定為const常量分配空間,分配空間的情況有兩種(1)前面出現了extern (2)出現了取地址符 。我們來詳細的說一下const常量在整個程序編譯過程中的變化。在C編譯器中,當遇見const的常量聲明的時候,在符號表中放入這個常量,編譯過程如果遇見這個常量則直接使用符號表中的常量進行替換,即使出現了extern或者&符號,也不會改變const的值,因為我們一直都是從符號表中取出這個變數的值的。


具體的原理圖如下所示:



從零開始學習C加加語言做C加加基礎學習筆記



3.問題:不清楚符號表具體是什麼,只記得學習C語言的時候一個老師提過一句。


4.通過上面的表述,我們可以發現在C++中,經過const修飾的變數徹徹底底的變為了一個常量,其功能有些類似於宏,不過兩者還是有很大區別的。


常式:


在C的環境下進行編譯。


# include f1() { #define a 3 } f2() { printf ("%d", a); } int main(int argc, char *argv[]) { f1(); f2(); getchar(); }


程序的運行結果為3.顯然我們在函數f1()中定義的宏在函數f2()中仍然起了作用。但是如果我們換一個方法


# include f1() { #define a 3 const int b = 4; } f2() { printf ("%d", a); printf ("%d", b); //這裡的b將會報錯,因為b是只讀變數,所以不可以跨函數列印。 } int main(int argc, char *argv[]) { f1(); f2(); getchar(); }


這個時候在f2()函數中仍然會列印a的值,但是這裡b將會報錯,因為b是只讀變數,不可以跨函數進行列印。


解決宏跨函數操作的方式:在宏結束的區間加上 #udef a,這樣在宏結束的區間就可以解除宏的作用範圍了。


雖然在C++中,const常量和宏的作用很近似,但是const常量是由編譯器處理的,提供類型檢查和作用域檢查,但是宏是由預編譯器處理的,只是進行簡單的文本呢替換。



從零開始學習C加加語言做C加加基礎學習筆記



五、C++中的struct


1.C++是一門類型十分強的語言。在C語言中struct用來定義一組變數的集合。


#include typedef struct Student { const char* name; int age; }S; int main(int argc, char *argv[]) { S s1; S s2; s1.age = 123; printf ("%d", s1.age); return 0; }


在C語言中,我們通常使用上述方法來進行操作,這裡只是簡單的對student裡面的變數進行了一個封裝。我們實際上是為了方便的操作一個整體。這也是結構體在C語言中的一個主要作用。


2.在C++中,strcut是一個新的類型的定義聲明。也就是說我們通過strcut在程序中定義了一個新的類型。常式:


#include struct Student { const char* name; int age; }; int main(int argc, char *argv[]) { Student s1 = {"wangming", 20}; Student s2 = {"lidan", 30}; }


在C++中,我們可以順利的運行這個程序,我們實際上是通過struct定義了一個student類型,然後我們通過這個類型定義了兩個變數分別是s1,s2 然後就可以對這兩個變數進行賦值了。但是在C語言中這種做法是完全錯誤的,因為我們並沒有定義類型。


六、C++中的函數類型加強


1.在C語言中,其實函數的類型要求並不是十分嚴格,我是一個菜鳥,沒有見過什麼大程序,不過前階段我在某實訓機構做了一個所謂的實訓項目,在做這個東西的時候,我的某一個函數始終都是沒有類型的,但是程序一直都可以編譯通過,直到後來我才發現這個問題。


常式:


#include fa() { int ret = 0; ret = 1; return ret; } fb() { printf ("hello world
"); } int main(int argc, char *argv[]) { int b = 0; b = fa(); printf ("b = %d
", b); fb(1); return 0; }


在上面的程序中,我們在主函數調用了兩個函數fa()和fb(),我們的運行環境是C。注意:我們的兩個函數都是沒有函數返回值類型和參數類型的函數。但是程序的運行結果如下:



從零開始學習C加加語言做C加加基礎學習筆記



很明顯,兩個函數都被成功的調用了,第一個函數沒有指明返回值類型但是程序還是成功的返回了整數,第二個程序我們在主函數中傳遞了參數,但是在調用函數中沒有聲明任何參數。產生這種現象的原因是C語言的默認類型導致的。很顯然,C語言的函數類型和函數的參數類型以及函數的參數個數都是很寬泛的,不過我們自己在編寫程序的時候最好還是注意類型,因為這樣不容易出錯,即使出錯了也容易查找。2.在C++中,上面的程序是編譯不通的,因為C語言的默認類型方式在C++中是不合法的。


在C語言中,int f()的返回值是int類型的整數,可以接受任意類型的參數。int f(void)返回值是int類型的整數,參數為空。


在C++中,int f()的返回值是int類型的整數,沒有任何參數。int f(void)和int f()具有相同的含義,返回值是int類型的整數,沒有任何參數。


請您繼續閱讀更多來自 鑫韭緣設計 的精彩文章:

TAG:鑫韭緣設計 |
您可能感興趣

零基礎初學者該如何學習C加加語言
談談C語言C加加學習的經驗
學習C加加要讀那些書
從零開始系統學習C語言C加加,零基礎到項目實戰
想要學習C語言C加加?C語言C加加入門書籍推薦
3分鐘帶你讀懂C語言和C加加學習路線
C語言程序之C加加數字學習
可以跳過C語言直接學習C加加?
學習C加加一定要先學C語言嗎?不是!
C加加對編程學習的重要性
C和C加加的學習過程總結,內有實用學習路線
C語言C加加 數據結構
C語言C加加數據結構,不會的一起來學習
學習C語言和C加加僅僅是為了高工資嗎?
學習C語言C加加你有興趣嗎?如果有,那麼就差學習方法和學習氛圍了
C語言C加加分享一個小編自己在C加加 Primer中的筆記
C語言C加加 修飾符類型
C加加貪吃蛇
C語言之C加加動態內存