C 面試題匯集

2022-03-27 19:13:06 字數 3407 閱讀 7790

1.在c++ 程式中呼叫被c 編譯器編譯後的函式,為什麼要加extern 「c」?

答:首先,extern是c/c++語言中表明函式和全域性變數作用範圍的關鍵字,該關鍵字告訴編譯器,其宣告的函式和變數可以在本模組或其它模組中使用。

通常,在模組的標頭檔案中對本模組提供給其它模組引用的函式和全域性變數以關鍵字extern宣告。extern "c"是連線申明(linkage declaration),被extern "c"修飾的變數和函式是按照c語言方式編譯和連線的。作為一種物件導向的語言,c++支援函式過載,而過程式語言c則不支援。函式被c++編譯後在符號庫中的名字與c語言的不同。例如,假設某個函式的原型為:void foo( int x, int y );該函式被c編譯器編譯後在符號庫中的名字為_foo,而c++編譯器則會產生像_foo_int_int之類的名字。這樣的名字包含了函式名、函式引數數量及型別資訊,c++就是靠這種機制來實現函式過載的。

所以,可以用一句話概括extern 「c」這個宣告的真實目的:解決名字匹配問題,實現c++與c的混合程式設計。

2.標頭檔案中的ifndef/define/endif有什麼作用?

答:這是c++預編譯標頭檔案保護符,保證即使檔案被多次包含,標頭檔案也只定義一次。

3. #include與 #include "file.h"的區別?

答:前者是從標準庫路徑尋找和引用file.h,而後者是從當前工作路徑搜尋並引用file.h。

4.評價一下c/c++各自的特點

答:c語言是一種結構化語言,面向過程,基於演算法和資料結構,所考慮的是如何通過乙個過程或者函式從輸入得到輸出;

c++是物件導向,基於類、物件和繼承,所考慮的是如何構造乙個物件模型,讓這個模型能夠契合與之對應的問題,通過獲取物件的狀態資訊得到輸出或實現過程控制。

5.const 有什麼用途?

答:在c/c++中,(1)可以定義const常量,(2)修飾函式的返回值和形參;

在c++中,還可以修飾函式的定義體,定義類的const成員函式。被const修飾的東西受到強制保護,可以預防意外的變動,提高了程式的健壯性。

6.const和#define有什麼區別?

答:(1)const和#define都可以定義常量,但是const用途更廣。

(2)const 常量有資料型別,而巨集常量沒有資料型別。編譯器可以對前者進行型別安全檢查。而對後者只進行字元替換,沒有型別安全檢查,並且在字元替換可能會產生意料不到的錯誤。

(3) 有些整合化的除錯工具可以對const 常量進行除錯,但是不能對巨集常量進行除錯。

7.關於sizeof小結的。

答:sizeof計算的是在棧中分配的記憶體大小。

(1) sizeof不計算static變數占得記憶體;

(2) 指標的大小一定是4個位元組,而不管是什麼型別的指標;

(3) char型佔1個位元組,int佔4個位元組,short int佔2個位元組

long int佔4個位元組,float佔4位元組,double佔48位元組,string佔4位元組

乙個空類佔1個位元組,單一繼承的空類佔1個位元組,虛繼承涉及到虛指標所以佔4個位元組

(4) 陣列的長度:

若指定了陣列長度,則不看元素個數,總位元組數=陣列長度*sizeof(元素型別)

若沒有指定長度,則按實際元素個數類確定

ps:若是字元陣列,則應考慮末尾的空字元。

推擠:52. c++裡面是不是所有的動作都是main()引起的?如果不是,請舉例.

比如全域性變數的初始化,就不是由main函式引起的

舉例: class a{};

a a; //a的建構函式限執行

int main() {}

53. 下列哪兩個是等同的

int b;

a const int* a = &b;

b const* int a = &b;

c const int* const a = &b;

d int const* const a = &b;

54. 內聯函式在編譯時是否做引數型別檢查?

答:內聯函式要做引數型別檢查, 這是內聯函式跟巨集相比的優勢。

55. 全域性變數和區域性變數有什麼區別?實怎麼實現的?作業系統和編譯器是怎麼知道的?

(1)生命週期不同:

全域性變數隨主程式建立和建立,隨主程式銷毀而銷毀

區域性變數在區域性函式內部,甚至區域性迴圈體等內部存在,退出就不存在; 記憶體中

分配在全域性資料區

(2)使用方式不同:通過宣告後全域性變數程式的各個部分都可以用到;區域性變數只能在區域性使用,分配在棧區

作業系統和編譯器通過記憶體分配的位置來知道的,全域性變數分配在全域性資料段並且在程式開始執行的時候被載入。區域性變數則分配在堆疊裡面 。

56. 有 a 、 b 、 c 、 d 四個人,要在夜裡過一座橋。他們通過這座橋分別需要耗時 1 、 2 、 5 、 10 分鐘,只有一支手電,並且同時最多只能兩個人一起過橋。請問,如何安排,能夠在 17 分鐘內這四個人都過橋?

solution:關鍵是時間最長的兩個人必須同時過橋

the first time : a(1) 和 b(2) 過橋, a(1) 返回 cost : 1+2

the second time : c(5) 和 d(10) 過橋, b(2) 返回 cost : 10+2

the third time a(1) 和 b(2) 過橋 cost : 2

total time cost : (1+2)+(10+2)+2=17 minutes

57. static全域性變數與普通的全域性變數有什麼區別?static區域性變數和普通區域性變數有什麼區別?static函式與普通函式有什麼區別?

答:static全域性變數與普通全域性變數區別:static全域性變數只初使化一次,防止在其他檔案單元中被引用;

static區域性變數和普通區域性變數區別:static區域性變數只被初始化一次,下一次依據上一次結果值;

static函式與普通函式區別:static函式在記憶體中只有乙份,普通函式在每個被呼叫中維持乙份拷貝。

58. 程式的區域性變數存在於(堆疊)中,全域性變數存在於(靜態區 )中,動態申請資料存在於( 堆)中。

59. 對於乙個頻繁使用的短小函式,在c語言中應用什麼實現,在c++中應用什麼實現?

c用巨集定義,c++用inline

60. 有1,2,....一直到n的無序陣列,求排序演算法,並且要求時間複雜度為o(n),空間複雜度o(1),使用交換,而且一次只能交換兩個數。

#includeusing 

namespace

std;

intmain();

int len = sizeof(a) / sizeof(int

);int

temp;

for(int i = 0; i for (int j = 0; j < len; j++)

cout

<","

;return0;

}//by 何問起 hovertree.com

**:

C 面試題匯集

自 1.在c 程式中呼叫被c 編譯器編譯後的函式,為什麼要加extern c 答 首先,extern是c c 語言中表明函式和全域性變數作用範圍的關鍵字,該關鍵字告訴編譯器,其宣告的函式和變數可以在本模組或其它模組中使用。通常,在模組的標頭檔案中對本模組提供給其它模組引用的函式和全域性變數以關鍵字e...

Android常見面試題匯集

彙總一 1.intent的幾種有關activity啟動的方式有哪些,你了解每個含義嗎?把這個作為面試題也是考察下,可以大概了解到它對android的了解程度,多移動開發的認識。彙總二 優勢 一 開放性 三 豐富的硬體選擇 五 無縫結合的google應用支援 缺點 一 安全和隱私 二,開發商自定義,不...

C 面試題之i 面試題

i 面試題1.cpp 中國台灣某著名防毒軟體公司2005年10月面試題 int i 3,j 4 i?i j printf d d n i,j a.3 3 b.4 4 c.3 4 d.4 3 答案b i 面試題2.cpp 中國某著名計算機金融軟公司2005年面試題 int x 1,j 2 int k ...