1. 程式人生 > >C 到 C++ 的升級(一)

C 到 C++ 的升級(一)

C++ C 到 C++ 升級 struct

我們之前學習了那麽多的 C 語言相關的知識,其實 C 語言是在實踐的過程中逐步完善起來的。C 語言在設計之初就是對 B 語言進行改良,使其能夠直接產生機器碼,C 語言由此誕生。後來 Unix 操作系統開始用 C 語言重寫,同時 C 語言在實踐的過程中也得到了發展。但是它沒有經過深思熟慮的設計過程,殘留了過多的低級語言的特征。C 語言的目標是高效,最終程序執行效率的高效。

本系列博客內容是根據狄泰軟件學院的嵌入式c++語言課程深度解析視頻培訓教程 的內容總結而來,狄泰技術交流群:199546072


那麽 C++ 繼承了所有的 C 特性,在 C 的基礎上提供了更多的語法和特性,C++ 的設計目標是運行效率與開發效率的統一。C++ 更強調語言的實用性,所有的變量都可以在需要使用時再定義。那麽對比 C 語言來說,它中的變量都必須在作用域開始的位置定義。就這點來說,C++已經更加強大了。C++ 的兩個 + 主要體現在兩方面:a> 類型的加強;b> 面向對象的支持。

register 關鍵字請求編譯器將局部變量存儲於寄存器中,在 C++ 中依然支持 register 關鍵字,這是為了要兼容 C 語言的特性。在 C++ 編譯器中,它有自己的優化方式,C 語言中無法獲取 register 變量的地址,但在 C++ 中可以獲取到 register 變量的地址。C++ 編譯器發現程序中需要獲取 register 變量的地址時,register 對變量的聲明變得無效。

在 C 語言中,重復定義多個同名的全局變量是合法的,但在 C++ 中,不允許定義多個同名的全局變量。因為在 C 語言中的多個同名的全局變量最終會被鏈接到全局數據區的同一個地址空間上。在 C++ 中直接拒絕這種二義性的做法!

下來我們來以代碼為例進行分析

#include <stdio.h>

int g_v;
//int g_v;

int main(int argc, char *argv[])
{
    printf("Begin...\n");
    
    int c = 0;
    
    for(int i=1; i<=3; i++)
    {
        for(int j=1; j<=3; j++)
        {
            c += i * j;
        }
    }
    
    printf("c = %d\n", c);
    
    register int a = 0;
    
    printf("&a = %p\n", &a);
    
    printf("End...\n");
    
    return 0;
}

我們以 C++ 的方式直接在第12行和第14行的兩個 for 循環中直接定義變量 i 和 j,這樣它們的作用域就是 for 循環了。直接打印 register 修飾的變量 a 的地址。看看編譯結果

技術分享圖片

我們再把第 4 行的註釋去掉,看看重復定義同名變量,它會報錯嗎

技術分享圖片

我們看到這樣是不允許的。在 C++ 中,struct 關鍵字也得到了加強。C 語言中的 struct 定義了一組變量的集合,它定義的標識符並不是一種新的類型,但在 C++ 中的 struct 能用與定義一個全新的類型。

技術分享圖片

在 C++ 中所有的標識符都必須顯示的聲明類型,C 語言中的默認類型在 C++ 總是不合法的。在 C 語言中,int f() 表示返回值為 int,接受任意參數的函數;f(void) 表示返回值為 int 的無參函數; 在 C++ 中,int f() 和 int f(void) 具有相同的意義,都表示返回值為 int 的無參函數

下來我們以代碼為例進行分析

#include <stdio.h>

struct Student
{
    const char* name;
    int age;
};

f(i)
{
    printf("i = %d\n", i);
}

g()
{
    return 5;
}


int main(int argc, char *argv[])
{
    Student s1 = {"Delphi", 30};
    Student s2 = {"Tang", 30};
    
    f(10);
    
    printf("g() = %d\n", g(1,2,3,4,5));
    
    return 0;
}

我們在第 3 行定義了一個結構體 Student,在 C++ 中是合法的,但是第9行和第14行的這種函數的寫法是不允許的,因此它會報錯。我們來看看編譯結果

技術分享圖片

我們看到定義和使用它們的地方都出錯了,我們註釋掉它們再來編譯

技術分享圖片

我們看到編譯通過了,證明 struct 可以直接定義類型。

這塊有個面試的小問題:int f() 和 int f(void) 有區別嗎?如果有,是什麽區別?答案就是看是什麽編譯器了,如果是 C 語言編譯器,便是有區別了。第一個表示返回值為 int 可接受任意多參數的函數,第二個是 返回值為 int 的無參函數如果是 C++ 編譯器,就是沒什麽區別啦。

通過對 C 到 C++ 的學習,總結如下:1、C++ 更強調實用性可以在任意的地方聲明變量;2、C++ 中的 register 只是一個兼容的作用;3、C++ 編譯器能夠更好的進行優化,它的任意標識符都必須顯示的指明類型。


歡迎大家一起來學習 C++ 語言,可以加我QQ:243343083

C 到 C++ 的升級(一)