生命週期:靜態變數在程式執行之前建立,在程式的整個執行期間始終存在,直到程式結束。
注意: 靜態變數,只改變了它的儲存型別(即生命週期),並沒有改變它的作用域,變數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 編譯,進行一系列詞法分析 ...