1. 程式人生 > >C/C++面試總結

C/C++面試總結

1.#include <> 與 #include “”的區別
前者先索引系統目錄,如果沒有,再索引當前目錄,後者先索引當前目錄,如果沒有再索引系統目錄
2.#ifndef、#define、#endif作用
防止重定義,即使檔案被多次包含,也只定義一次
3.const與#define的區別
(1) 兩者都可以定義常量,const用途更廣
(2) const常量有資料型別,而巨集常量沒有資料型別。編譯器可以對前者進行型別安全檢查。而對後者只進行字元替換,沒有型別安全檢查,並且在字元替換可能會產生意料不到的錯誤。
(3) 有些整合化的除錯工具可以對const 常量進行除錯,但是不能對巨集常量進行除錯。
4.在C++ 程式中呼叫被C 編譯器編譯後的函式,為什麼要加extern “C”?


C++不同與C,C++支援函式過載,所以C++編譯之後的符號名與C編譯之後的函式符號名與不同,eg:void foo(int a,int b),此函式經C編譯之後符號名可能為_foo,但是被C++編譯之後符號名可能為_foo_int_int。這樣的名字包含了函式名、函式引數數量及型別資訊。
加extern “C”之後,解決了名字匹配問題,事項C/C++混合程式設計
5.sizeof
答:sizeof計算的是在棧中分配的記憶體的大小,是唯一在編譯時計算的運算子,計算字串時包括‘\0’

1)sizeof不計算static變數佔的記憶體
(2)不管什麼型別的指標,大小一定是4個位元組
(3
char 1Byte int 4Byte unsigned int 4Byte short int 2Byte long int 4Byte float 4Byte double 8Byte string 4Byte4)陣列長度 *指定了陣列長度:不看元素個數,Byte = 陣列長度*sizeof(元素型別) *未指定陣列長度:按實際元素個數確定長度 Ps:若是字元陣列,應考慮末尾的空字元 (5)結構體物件長度 當結構體內元素長度小於處理器位數時,以結構體內最長資料元素的長度為對齊單位,即為其整數倍。 若結構體內資料長度大於處理器位數時,則以處理器位數為單位對齊。 (6

6.c/c++中的*與&

int a = 10;
int *point = &a;
//其中*表示這是一個指標型別的變數,&表示取a變數的地址,point指標指向a變數的地址
*p = 5;//*p表示取變數的內容進行操作

7.c中的%md,%mf

其中的m表示輸出寬度,若實際寬度小於m,則在左端補上空格之後輸出。若實際寬度大於m,則按實際寬度輸出

8.c語言中的unsigned char與char

//unsigned char 表示十進位制0-255的數
//char          表示十進位制-128~-1和0~127的數,16進位制數值減去256,最高位為符號位,0表示正數,1表示負數
//物理上儲存沒有區別
//          uchar   char
//0x7f      127     127
//0x80      128     -128
//0x81      129     -127

注意:int型-1在記憶體中怎樣儲存
(1)首先-1是一個有符號數,1的二進位制為00000000 00000000 00000000 00000001,-1則需要讓最高位變為1,即10000000 00000000 00000000 00000001。
    其次,負數在記憶體中儲存時除最高位,其他位按位取反+1,即為11111111 11111111 11111111 111111112)十六進位制的0xffffffff用有符號數來表示即用0xffffffff-232次方 = -1
    綜上:-1在記憶體中以11111111 11111111 11111111 11111111的形式存在 

9.迴圈體中的break,continue,return
break語句結束本層迴圈,continue語句結束本次迴圈,return語句結束函式

10.switch..case語句中,case後面必為常量

11.__cdecl
__cdecl是c\c++語言的預設呼叫方式,所有引數從右到左依次入棧,這些引數由呼叫者清除,稱為手動清棧。

12.C語言中的單目運算子:!、~、++、–

13.C語言中的static作用
1)在函式體內,一個被宣告為靜態的變數在這一函式被呼叫過程中維持其值不變(該變數存放在靜態變數區);

2) 在模組內(但在函式體外),一個被宣告為靜態的變數可以被模組內所用函式訪問,但不能被模組外其它函式訪問。它是一個本地的全域性變數。注意,只有在定義了變數後才能使用。如果變數定義在使用之後,要用extern 宣告。所以,一般全部變數都會在檔案的最開始處定義;

3) 在模組內,一個被宣告為靜態的函式只可被這一模組內的其它函式呼叫。那就是,這個函式被限制在宣告它的模組的本地範圍內使用;

以下是C++對static的擴充套件

4) 在類中的static成員變數意味著它為該類的所有例項所共享,也就是說當某個類的例項修改了該靜態成員變數,其修改值為該類的其它所有例項所見;

5) 在類中的static成員函式屬於整個類所擁有,這個函式不接收this指標,因而只能訪問類的static成員變數。