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 4Byte
(4)陣列長度
*指定了陣列長度:不看元素個數,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 11111111
(2)十六進位制的0xffffffff用有符號數來表示即用0xffffffff-2的32次方 = -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成員變數。