西郵Linux面試題總結

2021-10-03 09:22:05 字數 3249 閱讀 4234

生命週期:靜態變數在程式執行之前建立,在程式的整個執行期間始終存在,直到程式結束。

注意: 靜態變數,只改變了它的儲存型別(即生命週期),並沒有改變它的作用域,變數b還是只能在test函式內部使用。

靜態本地變數, 具有全域性的生存期, 只初始化一次, 離開函式後仍然存在, 具有函式內的區域性作用域.

靜態本地變數實際上是特殊的全域性變數, 都位於相同的記憶體區域, 即使在宣告時未賦初值, 也會預設初始化為0

相當於私有的全域性變數, 作用域只限於該原始檔.

static

void

test()

2.宣告內部函式

1 #include 23

static

void

test()

;45int

main

(int argc,

const

char

* ar**)

61011static

void

test()

在第11行定義了乙個test函式,這是乙個內部函式,接著在第3行對test函式進行提前宣告,然後就可以在第7行可以呼叫test()函式了

總結 :

1>巨集與typedef的區別:

(1)巨集只是簡單的替換, 而typedef可以看成是徹底的"封裝"

例:#define x int*

x a, b;

只有a是指標

typedef int* x

x a, b;

a, b都是指標

(2)可以用其他型別說明符對巨集定義的型別進行拓展, 而typedef不可以

例:#define x int

unsigned x a; 可以

而typedef x int; unsigned x a;不可以

2>#用來將巨集引數轉換為字串, 也就是在巨集引數的開頭和末尾新增引號, 例如:

#define a(x) #x

printf

("%s",a

(hello, world));

// 將會被展開為

printf

("%s"

,"hello, world"

);

3>##稱為連線符, 用來將巨集引數和其他的串連線起來. 例如:

#define a(a, b) a##e##b

#define b(a, b) a##b##00

printf

("%f\n",a

(1,2

));printf

("%d\n",b

(11,22

));// 將會被展開為

printf

("%f\n"

,1e2);

printf

("%d\n"

,112200

);

4>如果乙個巨集的值中有其他巨集的名字, 而巨集定義中無#或##, 則會先進行巨集引數的展開, 再展開當前巨集.例如:

#define year 2018

#define levelone(x) "xiyoulinux "#x"\n"

#define leveltwo(x) levelone(x)

#define multiply(x,y) x*y

intmain

(int argc,

char

*ar**)

十進位制8.25的二進位制是1000.01

->1.00001*2^3(3指數, 00001尾數)

浮點數中1.x*2^y也就是說1是固定的,2也是不變的,所以在記憶體中不用儲存,在記憶體中只存有x和y也就是尾數和指數,當然還有符號位.

浮點數在記憶體中無法精確儲存, float的有效位數只有7位(包括整數部分和小數部分), 超過7位之後均為無效數字, double的有效位數有16位, 超過16位之後均為無效數字.

判斷浮點數是否相同:由於精度問題, 不可將浮點變數用 == 或 != 與數字比較, 應該設法轉化為》= 或 <= 之類的形式

例:要判斷float型別的變數i與0的比較

if ((x >= -0.00001) && (x <= 0.00001))

也就是if (fabs(i-0) < 1e-6)

printf返回輸出的字元的個數

scanf返回正確讀取到的字元的個數

如果輸入資料與指定格式不符,則會產生輸入錯誤。遇到輸入錯誤,scanf函式會立即終止,返回已經成功讀取的資料的個數。

所以,通過scanf函式的返回值和指定輸入資料的個數(由格式符決定)的比較,可以判斷資料輸入是否成功。

個人pc一般都是小端序, 資料在記憶體中存放時低位元組對應低位址, 高位元組對應高位址.

讀取時從高位址往低位址讀取.

當定義乙個變數時,系統就會為這個變數分配一定的儲存空間。

1

intmain()

2

1> 在64bit環境下,系統為變數a、b分別分配1個位元組、4個位元組的儲存單元。也就是說:

.c ->.i -> .s -> .o -> a.out

1

intmain()

2

在第3行定義了乙個整型變數,它的值是-10。-10在記憶體中怎樣儲存的呢?其實任何數值在記憶體中都是以補碼的形式儲存的

那麼-10的補碼計算過程如下:

1> 先算出10的二進位制形式:0000 0000 0000 0000 0000 0000 0000 1010

2> 對10的二進位制進行取反:1111 1111 1111 1111 1111 1111 1111 0101

3> 對取反後的結果+1:1111 1111 1111 1111 1111 1111 1111 0110

因此,整數-10在記憶體中的二進位制形式是:1111 1111 1111 1111 1111 1111 1111 0110

第二種計算-10的補碼的方法:

1> 先寫出-10的原碼: 1000 1010

2> 在取反(符號位不變)得到反碼: 1111 0101

3> 在+ 1得到-10的補碼: 1111 0110

西郵Linux興趣小組面試題總結(2020)

define 識別符號 字串 下面 段的輸出結果是什麼?輸出該結果的原因是?define x a b intmain int argc,char ar 相當於 intmain int argc,char ar 輸出結果為 4在巨集體中,如果巨集引數前加個 那麼在巨集體擴充套件的時候,巨集引數會被擴充...

西郵Linux興趣小組2017納新面試題總結

main函式中帶了兩個引數,通常用int argc,char ar 來表示,這兩個引數也可以不用使用,它們的意義分別是 第乙個表示引數的個數 第二個引數中ar 0 為自身執行目錄路徑和程式名,ar 1 指向第乙個引數 ar 2 指向第二個引數 sizeof是乙個運算子,它的意義是計算出括號內內容所佔...

西郵Linux興趣小組2018納新面試題總結

對於一維陣列,1 array array 1 對於二維陣列,array i j i array j sizeof和strlen計算的區別是字串最後的那個 0,strlen不計算。前置 和後置 的區別 後置 是先取i的值做計算,計算後再自加1 a 預編譯,檔案字尾是.i b 編譯,進行一系列詞法分析 ...