C 小問題集錦

2022-04-01 16:17:51 字數 2990 閱讀 9803

摘要:在學習 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...