C 秋招記錄(九) C v s C

2021-10-12 07:43:54 字數 3647 閱讀 6846

c v.s. c++

(1)編寫的程式可讀性強,編譯效率高。

(2)具有簡潔緊湊、使用靈活的語法機制。

(3)資料結構豐富,滿足多種資料開發要求。

(4)允許直接訪問實體地址,對硬體進行操作。

(5)具有出色的可移植性,能在多種不同體系結構的軟/硬體平台上執行。

缺點:(1) c語言的缺點主要表現在資料的封裝性上,這一點使得c在資料的安全性上有很大缺陷,這也是c和c++的一大區別。

(2) c語言的語法限制不太嚴格,對變數的型別約束不嚴格,影響程式的安全性,對陣列下標越界不作檢查等。從應用的角度,c語言比其他高階語言較難掌握。也就是說,對用c語言的人,要求對程式設計更熟練一些。

(3) c語言的簡潔性與其豐富的運算子相結合,使其可能會編寫出極難理解的**。

(4) c語言表達方面的自由會增加風險。尤其是c語言對指標的使用。

1)c++是c的超集;

2)c是乙個結構化語言,它的重點在於演算法和資料結構。c程式的設計首要考慮的是如何通過乙個過程,對輸入(或環境條件)進行運算處理得到輸出(或實現過程(事務)控制),而對於c++是乙個物件導向,首要考慮的是如何構造乙個物件模型,讓這個模型能夠契合與之對應的問題域,這樣就可以通過獲取物件的狀態資訊得到輸出或實現過程(事務)控制。

3)物件導向和泛型程式設計:oop試圖將datas與method關聯一起;gp將datas與method分離開來

這裡考察的是c 中的預設型別機制。

在c中,int fun() 會解讀為返回值為int輸入型別和個數沒有限制, 而int fun(void)則限制輸入型別為乙個void;即使前面沒有int,也是如此,但是在c++中如果沒有返回型別將報錯。

在c++下,這兩種情況都會解讀為返回int型別,輸入void型別

不能。c中的const僅僅是從編譯層來限定,不允許對const 變數進行賦值操作,在執行期是無效的,所以並非是真正的常量(比如通過指針對const變數是可以修改值的),但是c++中是有區別的,c++在編譯時會把const常量加入符號表,以後(仍然在編譯期)遇到這個變數會從符號表中查詢,所以在c++中是不可能修改到const變數的。

1) c中的區域性const常量儲存在棧空間,全域性const常量存在唯讀儲存區,所以全域性const常量也是無法修改的,它是乙個唯讀變數。

2) 這裡需要說明的是,常量並非僅僅是不可修改,而是相對於變數,它的值在編譯期已經決定,而不是在執行時決定。

3)c++中的const 和巨集定義(#definde)是有區別的,巨集是在預編譯期直接進行文字替換(不可以進行類別檢測),而const發生在編譯期,是可以進行型別檢查和作用域檢查的。

4)c語言中只有enum可以實現真正的常量。

5) c++中只有用字面量初始化的const常量會被加入符號表,而變數初始化的const常量依然只是唯讀變數。

6). c++中const成員為唯讀變數,可以通過指標修改const成員的值,另外const成員變數只能在初始化列表中進行初始化

c語言中的struct與c++中的struct的區別表現在以下3個方面:

(1) c語言的struct不能有函式成員,而c++的struct可以有。

(2) c語言的struct中資料成員沒有private、public和protected訪問許可權的設定,而c++ 的struct的成員有訪問許可權設定。

(3) c語言的struct是沒有繼承關係的,而c++的struct卻有豐富的繼承關係。

c語言中的struct是使用者自定義資料型別,它是沒有許可權設定的,它只能是一些變數的集合體,雖然可以封裝資料卻不可以隱藏資料,而且成員不可以是函式。為 了和c語言相容,c++中就引入了 struct關鍵字。c++語言中的struct是抽象資料型別 (adt),它支援成員函式的定義,同時它增加了訪問許可權,它的成員函式預設訪問許可權為 public。

具體而言,在c++中,class和struct做型別定義時只有兩點區別:

(1)預設繼承許可權不同。class繼承預設是private繼承,而struct繼承預設是public繼承;

(2)class還用於定義模板引數,就像typename,但關鍵字struct不用於定義模板引數。

答案:不是。兩個不同型別的指標之間可以強制轉換(用reinterpret cast)。c#是型別安全的。

c中是直接在變數或者表示式前面加上(小括號括起來的)目標型別來進行轉換,一招走天下,操作簡單,但是由於太過直接,缺少檢查,因此容易發生編譯檢查不到錯誤,而人工檢查又及其難以發現的情況;而c++中引入了下面四種轉換:

在c++中,普通型別可以通過型別轉換建構函式轉換為類型別,那麼類可以轉換為普通型別嗎?答案是肯定的。但是在工程應用中一般不用型別轉換函式,因為無法抑制隱式的呼叫型別轉換函式(型別轉換建構函式可以通過explicit來抑制其被隱式的呼叫),而隱式呼叫經常是bug的**。實際工程中替代的方式是定義乙個普通函式,通過顯式的呼叫來達到型別轉換的目的。

在 c++運算子集合中,有一些運算子是不允許被過載的。這種限制是出於安全方面的考慮,可防止錯誤和混亂。

(1)不能改變 c++內部資料型別(如 int,float 等)的運算子。

(2)不能過載『.』,因為『.』在類中對任何成員都有意義,已經成為標準用法。

(3)不能過載目前 c++運算子集合中沒有的符號,如#,@,$等。原因有兩點,一是難以理解,二是難以確定優先順序。

(4)對已經存在的運算子進行過載時,不能改變優先順序規則,否則將引起混亂。

c++語言支援函式過載,c語言不支援函式過載,函式被c++編譯器編譯後在庫中的名字與c語言的不同,假設某個函式原型為:

void foo(int x, int y);

該函式被c編譯器編譯後在庫中的名字為 _foo, 而c++編譯器則會產生像: _foo_int_int 之類的名字。為了解決此類名字匹配的問題,c++提供了c鏈結交換指定符號 extern 「c」。

相同點:它們的作用是防止標頭檔案被重複包含。

不同點:

struct (結構體)與union (聯合體)是c語言中兩種不同的資料結構,兩者都是常見的復合結構,其區別主要表現在以下兩個方面:

typedef

union

date;

struct data max;

printf

("%d",sizeof

(struct date)

+sizeof

(max)

);

假設為32位機器,date是乙個聯合型變數,聯合型變數公用空間,裡面最大的變數型別是int[5],所以占用20個位元組,而由於union中double佔了8個位元組,為了實現8位元組對齊,所以union所佔空間為24。而data是乙個結構體變數,每個變數分開占用空間,依次為sizeof(int) +sizeof(date)+sizeof(double)=4+24+8=36,而double為8位元組,為了8位元組對齊,占用空間為40。所以列印結果是 24 + 40 = 64 個位元組。

秋招面試記錄

美團北斗計畫 推薦演算法研發 大資料與演算法部門 20190805初試 1.5h 手撕 最小的k個數 利用快排的思想,o n 缺點 修改原有陣列 class solution def getleastnumbers solution self,tinput,k write code here 利用快...

部落格96 記錄秋招面試 二

內容 繼續記錄秋招經歷的面試,記錄下秋招的一次終面。面試形式 面試 面試崗位 c c 面試問題 1.專案介紹 2.專案用到了什麼知識點?3.先做一道演算法題吧,題目是 有一堆ip位址和ip位址段,比如192.168.0.1或者是192.168.0.5 192.168.0.10這樣子的集合,有兩個這樣...

部落格99 記錄秋招面試 五

內容 記錄一次秋招以來最考驗現場發揮的一次面試 面試問題 1.自我介紹 2.c c 哪個用得多?3.介紹專案 4.介紹實習 5.listen,bind,accept函式的形參和返回值,乙個個函式來,每個都過一遍,問得比較細。每個形參意義,型別,返回值種類 6.send和recv的返回值以及如何處理 ...