C++在C的基礎上改進了哪些細節

程式設計師白二呀發表於2020-11-07

C++ 是在C語言的基礎上改進的,C語言的很多語法在 C++ 中依然廣泛使用,例如:

C++ 仍然使用 char、short、int、long、float、double 等基本資料型別;


C++ 仍然使用 if...else、while、for、switch、break 等分支或迴圈結構;


C++ 仍然使用 +、-、*、/、%、++、--、<<、>> 等運算子;


C++ 仍然使用 typedef、#define、enum、struct 等;


C++ 仍然使用C語言中經典的指標(Pointer),並且使用範圍有增無減,甚至不可或缺。

下面我們再來談一下C++改進了哪些細節。
變數定義位置
ANSI C 規定,所有區域性變數都必須定義在函式開頭,在定義好變數之前不能有其他的執行語句。C99 標準取消這這條限制,但是 VC/VS 對 C99 的支援很不積極,仍然要求變數定義在函式開頭。請看下面的程式碼:
· #include <stdio.h>
· · int main(){
· · int a;
· · scanf("%d", &a);
· · int b;
· · scanf("%d", &b);
· · int c = a + b;
· · printf("%d\n", c);
· ·
· · return 0;
· · }
· 將程式碼儲存到原始檔main.c,那麼它可以在 GCC、Xcode 下編譯通過,但在 VC/VS 下會報錯。GCC、Xcode 對 C99 的支援非常好,可以在函式的任意位置定義變數;但 VC/VS 對 C99 的支援寥寥無幾,必須在函式開頭定義好所有變數。

將上面的程式碼再儲存到原始檔main.cpp,那麼它在 GCC、Xcode、VC/VS 下都可以編譯通過。這是因為 C++ 取消了原來的限制,變數只要在使用之前定義好即可,不強制必須在函式開頭定義所有變數。
注意原始檔的字尾,.c是C語言程式碼,.cpp是C++程式碼,它們的編譯方式不同。
取消限制帶來的另外一個好處是,可以在 for 迴圈的控制語句中定義變數,請看下面的例子:
· #include
· · using namespace std;
· ·
· · int sum(int n){
· · int total = 0;
· · //在for迴圈的條件語句內部定義變數i
· · for(int i=1; i<=n ;i++){
· · total += i;
· · }
· · return total;
· · }
· ·
· · int main(){
· · cout<<"Input a interge: ";
· · int n;
· · cin>>n;
· · cout<<"Total: "<<sum(n)<<endl;
· · return 0;
· · }
· 執行結果:
Input a interge: 10
Total: 55

在 for 內部定義迴圈控制變數 i,會讓程式碼看起來更加緊湊,並使得 i 的作用域被限制在整個 for 迴圈語句內部(包括迴圈條件和迴圈體),減小了命名衝突的概率。在以後的編碼過程中,我推薦這種寫法。

在學習的過程中總會遇見一些困難與疑惑,我也是這樣過來的,知道你們的難處。所以我建立了一個企鵝群:105+302+98+69,用來交流學習的,有不懂的問題可以在群裡提問,群裡也會有我之前學習C/C++的學習資料跟我之前VIP上課的課程視訊,都可以免費分享給大家,讓我們一起成長,成為一個優秀的人。
布林型別(bool)
在C語言中,關係運算和邏輯運算的結果有兩種,真和假:0 表示假,非 0 表示真。例如:
· #include <stdio.h>
· · int main(){
· · int a, b, flag;
· · scanf("%d %d", &a, &b);
· · flag = a > b;  //flag儲存關係運算結果
· · printf("flag = %d\n", flag);
· ·
· · return 0;
· · }
· 執行結果:
10 20↙
flag = 0

C語言並沒有徹底從語法上支援“真”和“假”,只是用 1 和 0 來代表。這點在 C++ 中得到了改善,C++ 新增了bool型別,它一般佔用 1 個位元組長度。bool 型別只有兩個取值,true 和 false:true 表示“真”,false 表示“假”。請看下面的例子:
· #include
· · using namespace std;
· ·
· · int main(){
· · int a, b;
· · bool flag;  //布林變數
· · cin>>a>>b;
· · flag = a > b;
· · cout<<"flag = "<<flag<<endl;
· ·
· · return 0;
· · }
· 10 20↙
flag = 0

遺憾的是,在 C++ 中使用 cout 輸出 bool 變數的值時還是用數字 1 和 0 表示,而不是 true 或 false。Java、PHP、JavaScript 等也都支援布林型別,但輸出結果為 true 或 false,我武斷地認為這樣更科學。

你也可以顯式地對 bool 變數賦值,例如:
· #include
· · using namespace std;
· ·
· · int main(){
· · bool flag = true;
· · if(flag){
· · cout<<"true"<<endl;
· · }else{
· · cout<<"false"<<endl;
· · }
· ·
· · flag = false;
· · if(flag){
· · cout<<"true"<<endl;
· · }else{
· · cout<<"false"<<endl;
· · }
· ·
· · return 0;
· · }
· 執行結果:
true
false
注意,true 和 false 是 C++ 中的關鍵字。
在以後的編碼中,我推薦使用 bool 變數來表示邏輯運算、關係運算以及開關變數的值

相關文章