摘要:在學習 c 語言程式設計中遇到的一些容易混淆出錯的問題,記錄下來備忘。
c語言學習 小問題集錦
參考:章節:
正文:一、陣列元素 a[n++] 是 a[n] 還是 a[n+1]?
在學習排序中,看到了一種寫法,a[n++],這個a[n++]到底是 a[n]還是 a[n+1]?不用多說,上測試**:
#include
int main(void);
printf("array: ");
for(int i=0;i<4;i++)
printf(" n=%d \n",n);
int n=0;
a[n++]=8;
printf("array: ");
for(int i=0;i<4;i++)
printf(" n=%d \n",n);
return 0;
}/*結果:
array: 1 2 3 4 n=0
array: 8 2 3 4 n=1
*/結果表明:a[n++] 還是指 a[n],然後n=n+1了。
二、2個遞迴如何執行?
在學習快速排序的時候,遇到了同時有2個遞迴的情況,如:
quicksort(a,left,i-1);
quicksort(a,i+1,right);
他們到底是怎麼執行的呢?上測試**:
#include
int n=0;
void recursion(int a,int b)
int main(void)
/*結果:
1 : r: 0 1
2 : r: 0 2
3 : r: 0 3
4 : r: 1 3
5 : r: 1 2
6 : r: 0 3
7 : r: 1 3
8 : r: 1 1
9 : r: 0 2
10 : r: 0 3
11 : r: 1 3
12 : r: 1 2
13 : r: 0 3
14 : r: 1 3
*/根據遞迴的原理,用棧記錄函式的出入口,我簡單地認為把函式壓入棧,根據棧後進先出的特性,我把上面的用符號記錄過程,把兩個函式分別標記為r0,r1。r0-1--代表第1個遞迴函式,b值為1;r1-2,代表第2個遞迴函式,b值為2,下來分解:
步 執行及b值 棧內及b值 描述
1 r0-1 r1-1 b=1,執行r0-1,把r1-1壓入棧
2 r0-2 r1-1, r1-2 進入r0,b++為2,執行r0-2,把r1-2壓入棧
3 r0-3 r1-1, r1-2, r1-3 進入r0,b++為3,執行r0-3,把r1-3壓入棧
4 r1-3 r1-1, r1-2 進入r0,b++為4,觸發退出,回到棧內取最後乙個r1-3執行
5 r1-2 r1-1 r1-3執行,觸發退出,執行r1-2
6 r0-3 r1-1, r1-3 進入r1-2,b++為3,執行 r0-3,把r1-3壓入棧
7 r1-3 r1-1 r0-3觸發退出,從棧內取出 r1-3執行
8 r1-1 r1-2 執行r1-1,進入r0-2,把r1-2壓入棧
9 r0-2 r1-2, r1-3 執行r0-2,進入r0-3,把r1-3壓入棧
10 r0-3 r1-2, r1-3 執行r0-3,觸發退出
11 r1-3 r1-2 執行r1-3,觸發退出
12 r1-2 r1-3 執行r1-2,b++為3,準備進入r0-3,把r1-3壓入棧
13 r0-3 r1-3 執行r0-3,觸發退出
14 r1-3 執行r1-3,觸發退出,棧內為空,全部結束。
腦袋都疼了,那麼複雜,這些人到底怎麼想出來的,難道他只用知道退出機制及計算過程,根本不關注執行順序。
三、傳遞陣列的元素個數?
在學習排序中,經常要迴圈,需要知道陣列的長度(元素個數),在同個函式內,用
int len=sizeof(a)/sizeof(a[0]);
就能知道,把陣列傳遞進函式後,難道也能這樣?上測試**:
#include
void test(int a)
int main(void);
printf("none : a %2d, a[0] %d,num %d\n",sizeof(a),sizeof(a[0]),sizeof(a)/sizeof(a[0]));
test(a);
return 0;
}/*輸出:
none : a 16, a[0] 4,num 4
byref: a 8, a[0] 4,num 2
*/明顯在傳遞陣列的函式內再用這種方式是錯誤,原因在於陣列作為形式引數是指標化了,顯示的是指標的大小,64位平台指標是8 byte的。查了一堆資料,除了用結構 struct 把陣列包裝一下,如下:
struct a;
這樣能通過 count 取得陣列大小,但這樣又涉及陣列的初始化等問題,很是麻煩。
若還在學習的過程中碰到這些小問題,繼續補充。
未完待續...
面試小問題集錦
關於makefile 如何生成動態鏈結庫和靜態鏈結庫,生成這些庫的作用是什麼?無論靜態庫,還是動態庫,都是由 o檔案建立的。靜態庫檔名的命名規範是以lib為字首,緊接著跟靜態庫名,擴充套件名為.a。例如 我們將建立的靜態庫名為myhello,則靜態庫檔名就是libmyhello.a。在建立和使用靜態...
xml小問題集錦
1.密碼中就算只有數字,也要加引號 name username value root name password value 123456 否則報錯linenumber 15 columnnumber 36 與元素型別 value 相關聯的屬性 應有左引號。2.log4jd 中 代表的注釋必須換行寫...
Android小問題集錦
1.android head detached at x 解決方法 切回分支直接用git checkout 分支名 git checkout b 本地分支名 remotes origin 遠端分支名,這個命令是在本地建立乙個分支名,並且將遠端的分支引入到這裡,因為我本地已經有了這個分支名,直接用 g...