<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="http://cobra.ee.ntu.edu.tw/lifetype/styles/rss.css" type="text/css"?>
<rss version="2.0" 
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
>
 <channel>
  <title>clyde</title>
  <link>http://cobra.ee.ntu.edu.tw/lifetype/blog/clyde</link>
  <description></description>
  <pubDate>Mon, 23 Nov 2009 09:43:24 +0800</pubDate>
  <generator>http://www.lifetype.net</generator>
    <item>
   <title>C 語言新手十誡(The Ten Commandments for Newbie C Programmers)</title>
   <description>
    &lt;p&gt;&lt;font size=&quot;2&quot;&gt;本篇從 ptt c_and_cpp 轉錄過來的&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&amp;nbsp;&lt;/font&gt;&lt;font size=&quot;2&quot;&gt;請注意：&lt;br /&gt;&lt;br /&gt;(1) 本篇旨在提醒新手，避免初學常犯的錯誤（其實老手也常犯:-Q)。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 但不能取代完整的學習，請自己好好研讀一兩本 C 語言的好書，&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 並多多實作練習。&lt;br /&gt;&lt;br /&gt;(2) 強烈建議新手先看過此文再發問，你的問題極可能此文已經提出並&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 解答了。&lt;br /&gt;&lt;br /&gt;(3) 以下所舉的錯誤例子如果在你的電腦上印出和正確例子相同的結果，&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 那只是不足為恃的一時僥倖。&lt;br /&gt;&lt;br /&gt;(4) 不守十誡者，輕則執行結果的輸出數據錯誤，或是程式當掉，重則&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 引爆核彈、毀滅地球（如果你的 C 程式是用來控制核彈發射器的話）。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;一、你不可以使用尚未給予適當初值的變數。&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 錯誤例子：&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int accumulate(int max)&amp;nbsp;&amp;nbsp;&amp;nbsp; /* 從 1 累加到 max，傳回結果 */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int sum;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* 未給予初值的區域變數，其內容值是垃圾 */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int num;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (num = 1; num &amp;lt;= max; num++) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sum += num;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return sum;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 正確例子：&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int accumulate(int max)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int sum = 0;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* 正確的賦予適當的初值 */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int num;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (num = 1; num &amp;lt;= max; num++) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sum += num;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return sum;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;二、你不可以存取超過陣列既定範圍的空間。&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 錯誤例子：&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int str[5];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int i;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (i = 0; i &amp;lt;= 5; i++) str[i] = i;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 正確例子：&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int str[5];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int i;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (i = 0; i &amp;lt; 5; i++) str[i] = i;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 說明：宣告陣列時，所給的陣列元素個數值如果是 N, 那麼我們在後面&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 透過 [索引值] 存取其元素時，所能使用的索引值範圍是從 0 到 N-1,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 也就是 C 和 C++ 的陣列元素是從第 0 個開始算起，最後一個元素的&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 索引值是 N-1, 不是 N。&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; C/C++ 為了執行效率，並不會自動檢查陣列索引值是否超過陣列邊界，&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 我們要自己寫程式來確保不會越界。一旦越界，將導致無法預期的後果。&lt;br /&gt;&lt;br /&gt;三、你不可以提取(dereference)不知指向何方的指標（包含 null 指標）。&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 錯誤例子：&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; char *pc1;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* 未給予初值，不知指向何方 */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; char *pc2 = 0;&amp;nbsp; /* pc2 起始化為 null pointer */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; *pc1 = &amp;#39;a&amp;#39;;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* 將 &amp;#39;a&amp;#39; 寫到不知何方，錯誤 */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; *pc2 = &amp;#39;b&amp;#39;;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* 將 &amp;#39;b&amp;#39; 寫到「位址0」，錯誤 */&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 正確例子：&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; char c;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* c 的內容尚未起始化 */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; char *pc1 = &amp;amp;c;&amp;nbsp; /* pc1 指向字元變數 c */&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* 動態分配 10 個 char(其值未定),並將第一個char的位址賦值給 pc2 */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; char *pc2 = (char *)malloc(10);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; *pc1 = &amp;#39;a&amp;#39;;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* c 的內容變為 &amp;#39;a&amp;#39; */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pc2[0] = &amp;#39;b&amp;#39;;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* 動態配置來的第 0 個字元，內容變為 &amp;#39;b&amp;#39;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* 最後記得 free() 掉 malloc() 所分配的空間 */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; free(pc2);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 說明：指標變數必需先指向某個明確的東西(object)，才能進行操作。&lt;br /&gt;&lt;br /&gt;四、你不可以將字串常數賦值(assign)給 char* 變數，然後透過該變數&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 改寫字串的內容（只能讀不能寫）。&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 錯誤例子：&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; char* pc = &amp;quot;john&amp;quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; *pc = &amp;#39;J&amp;#39;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf(&amp;quot;Hello, %s\n&amp;quot;, pc);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 正確例子：&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; char pc[] = &amp;quot;john&amp;quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; *pc = &amp;#39;J&amp;#39;;&amp;nbsp; /* 或&amp;nbsp; pc[0] = &amp;#39;J&amp;#39;;&amp;nbsp; */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf(&amp;quot;Hello, %s\n&amp;quot;, pc);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 說明：字串常數的內容是唯讀的。上面的錯誤例子，是將其內容所在的位址賦&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 值給字元指標 pc, 我們透過指標只可以去讀該字串常數的內容，而不應該做&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 寫入的動作。而正確例子，則是另外宣告一個獨立的字元陣列，它的大小我們&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 未明文指定（[]），編譯器會自動將其設為剛好可以容納後面的字串常數起始&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 值的大小，包括字串後面隱含的 &amp;#39;&amp;#39; 字元，並將字串常數的內容複製到字元&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 陣列中，因此可以自由的對該字元陣列的內容進行讀和寫。&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 錯誤例子(2)：&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; char *s1 = &amp;quot;Hello, &amp;quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; char *s2 = &amp;quot;world!&amp;quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* strcat() 不會另行配置空間，只會將資料附加到 s1 所指唯讀字串的後面，&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 造成寫入到程式無權碰觸的記憶體空間 */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; char *s3 = strcat(s1, s2);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 正確例子(2)：&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* s1 宣告成陣列，並保留足夠空間存放後續要附加的內容 */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; char s1[20] = &amp;quot;Hello, &amp;quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; char *s2 = &amp;quot;world!&amp;quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* 因為 strcat() 的返回值等於第一個參數值，所以 s3 就不需要了 */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; strcat(s1, s2);&lt;br /&gt;&lt;br /&gt;五、你不可以對尚未分配所指空間的 char* 變數，進行(字串)陣列的相關操作。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 其他型別的指標亦然。&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 錯誤例子：&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; char *name;&amp;nbsp;&amp;nbsp; /* name 尚未指向有效的空間 */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf(&amp;quot;Your name, please: &amp;quot;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; gets(name);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf(&amp;quot;Hello, %s\n&amp;quot;, name);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 正確例子(1)：&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* 如果編譯期就能決定字串的最大空間，那就不要宣告成 char* 改用 char[] */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; char name[21]; /* 字串最長 20 個字元，另加一個 &amp;#39;&amp;#39; */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf(&amp;quot;Your name, please: &amp;quot;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; gets(name);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf(&amp;quot;Hello, %s\n&amp;quot;, name);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 正確例子(2)：&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* 若是在執行時期才能決定字串的最大空間，則需利用 malloc() 函式來動態&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 分配空間 */&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; size_t length;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; char *name;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf(&amp;quot;請輸入字串的最大長度(含null字元): &amp;quot;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; scanf(&amp;quot;%u&amp;quot;, &amp;amp;length);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; name = (char *)malloc(length);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf(&amp;quot;Your name, please: &amp;quot;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; scanf(&amp;quot;%s&amp;quot;, name);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf(&amp;quot;Hello, %s\n&amp;quot;, name);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* 最後記得 free() 掉 malloc() 所分配的空間 */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; free(name);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 注意：上例用 gets() 或 scanf() 來讀入字串，是不安全的。 因為這些函式&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 不會幫我們檢查使用者所輸入的字串長度是否超過我們所分配的 buffer 空間，&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 很可能會發生 buffer overflow。比較安全的做法是用 fgets() 來取代。如：&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; char *p;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; char name[21];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf(&amp;quot;Your name, please: &amp;quot;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; fgets(name, sizeof(name), stdin);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* fgets()會連行末的&amp;#39;\n&amp;#39;也讀進字串中，所以要找出存入&amp;#39;\n&amp;#39;的位置，填入 &amp;#39;&amp;#39;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ((p = strchr(name, &amp;#39;\n&amp;#39;)) != NULL)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *p = &amp;#39;&amp;#39;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf(&amp;quot;Hello, %s\n&amp;quot;, name);&lt;br /&gt;&lt;br /&gt;六、你不可以在函式中回傳一個指向區域性自動變數的指標。否則，會得到垃圾值。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [感謝 gocpp 網友提供程式例子]&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 錯誤例子：&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; char *getstr(char *name)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; char buf[30] = &amp;quot;hello, &amp;quot;; /*將字串常數&amp;quot;hello, &amp;quot;的內容複製到buf陣列*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; strcat(buf, name);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return buf;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 說明：區域性自動變數，將會在離開該區域時(本例中就是從getstr函式返回時)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 被消滅，因此呼叫端得到的指標所指的字串內容就失效了。【不過，倒是可以從&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 函式中直接傳回字串常數，賦值給呼叫端的一個 const char * 變數，它既是唯&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 讀的（參見第四誡），同時也具有恒常的儲存期(static storage duration),其&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 內容將一直有效。】&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 正確例子：&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; void getstr(char buf[], int buflen, char const *name)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; char const s[] = &amp;quot;hello, &amp;quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; assert(strlen(s) + strlen(name) &amp;lt; buflen);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; strcpy(buf, s);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; strcat(buf, name);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [針對字串操作，C++提供了更方便安全的 string class, 能用就盡量用]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #include &amp;lt;string&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; using std::string;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; string getstr(string const &amp;amp;name)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return string(&amp;quot;hello, &amp;quot;) += name;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;七、你不可以只做 malloc(), 而不做相應的 free(). 否則會造成記憶體漏失。&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 但若不是用 malloc() 所得到的記憶體，則不可以 free()。已經 free()了&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 所指記憶體的指標，在它指向另一塊有效的動態分配得來的空間之前，不可&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 以再被 free()，也不可以提取(dereference)這個指標。&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [C++] 你不可以只做 new, 而不做相應的 delete.&lt;br /&gt;&lt;br /&gt;八、你不可以在數值運算、賦值或比較中隨意混用不同型別的數值，而不謹慎考&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 慮數值型別轉換可能帶來的「意外驚喜」（錯愕）。必須隨時注意數值運算&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 的結果，其範圍是否會超出變數的型別。&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 錯誤例子(1)：&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; unsigned int sum = 2000000000 + 2000000000; /* 20 億 */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; double f = 10 / 3;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 正確例子(1)：&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* 全部都用 unsigned int, 注意數字後面的 u, 大寫 U 也成 */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; unsigned int sum = 2000000000u + 2000000000u;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* 或是用顯式的轉型 */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; unsigned int sum = (unsigned int)2000000000 + 2000000000;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; double f = 10.0 / 3.0;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 說明：在目前最普遍的32位元PC作業平台上，整數常數2000000000的型別為&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; signed int(簡寫為 int)，相加後，其結果仍為 int, 但是 signed int&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 放不下 4000000000, 造成算術溢位(arithmetic overflow)，很可能無法&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 將正確的值指派給 unsigned int sum，縱使 unsigned int 放得下4000000000&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 的數值。注意：寫成&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; unsigned int sum = (unsigned int)(2000000000 + 2000000000);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 也是不對的。&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 例子(2)：（感謝 sekya 網友提供）&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; unsigned char a = 0x80;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; char b = 0x80;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* implementation-defined result */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if( a == 0x80 ) {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* 恒真 */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf( &amp;quot;a ok\n&amp;quot; );&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if( b == 0x80 ) {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* 不一定恒真 */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf( &amp;quot;b ok\n&amp;quot; );&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 說明：在將 char 型別定義為範圍從 -128 至 +127 的系統上，int 0x80&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; （其值等於 +128）要轉成 char 會放不下，會產生編譯器自行定義的值。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 這樣的程式就不具可移植性了。&lt;br /&gt;&lt;br /&gt;九、你不可以在一個運算式(expression)中，對一個基本型態的變數修改其值&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 超過一次以上。否則，將導致未定義的行為(undefined behavior)。&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 錯誤例子：&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int i = 7;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int j = ++i + i++;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 正確例子：&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int i = 7;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int j = ++i;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; j += i++;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 你也不可以在一個運算式(expression)中，對一個基本型態的變數修改其值，&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 而且還在同一個式子的其他地方為了其他目的而存取該變數的值。（其他目的，&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 是指不是為了計算這個變數的新值的目的）。否則，將導致未定義的行為。&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 錯誤例子：&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int arr[5];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int i = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; arr[i] = i++;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 正確例子：&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int arr[5];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int i = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; arr[i] = i;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; i++;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [C++程式]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 錯誤例子：&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int i = 10;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; cout &amp;lt;&amp;lt; i &amp;lt;&amp;lt; &amp;quot;==&amp;quot; &amp;lt;&amp;lt; i++;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 正確例子：&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int i = 10;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; cout &amp;lt;&amp;lt; i &amp;lt;&amp;lt; &amp;quot;==&amp;quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; cout &amp;lt;&amp;lt; i++;&lt;br /&gt;&lt;br /&gt;十、你不可以在macro的定義中，不為它的參數個別加上括號。&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 錯誤例子：&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #define SQUARE(x)&amp;nbsp;&amp;nbsp;&amp;nbsp; (x * x)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int main()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf(&amp;quot;%d\n&amp;quot;, SQUARE(10-5));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 正確例子：&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #define SQUARE(x)&amp;nbsp;&amp;nbsp;&amp;nbsp; ((x) * (x))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int main()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf(&amp;quot;%d\n&amp;quot;, SQUARE(10-5));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 說明：如果是用 C++, 請多多利用 inline function 來取代上述的 macro,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 以免除 macro 定義的種種危險性。如：&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; inline int square(int x) { return x * x; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; macro 定義出的「偽函式」至少缺乏下列數項函式本有的能力：&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (1) 無法進行參數型別的檢查。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (2) 無法遞迴呼叫。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (3) 無法用 &amp;amp; 加在 macro name 之前，取得函式位址。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (4) 呼叫時往往不能使用具有 side effect 的引數。例如：&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 錯誤例子：（感謝 yaca 網友提供）&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #define MACRO(x)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (((x) * (x)) - ((x) * (x)))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int main()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int x = 3;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf(&amp;quot;%d\n&amp;quot;, MACRO(++x));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; MACRO(++x) 展開來後變成 (((++x) * (++x)) - ((++x) * (++x)))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 違反了第九誡。在 gcc 4.3.3 下的結果是 -24, 在 vc++ 下是 0.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;後記：從「古時候」流傳下來一篇文章&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;quot;The Ten Commandments for C Programmers&amp;quot;(Annotated Edition)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; by Henry Spencer&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; http://www.lysator.liu.se/c/ten-commandments.html&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 一方面它不是針對 C 的初學者，一方面它特意模仿中古英文&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 聖經的用語，寫得文謅謅。所以我現在另外寫了這篇，希望&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 能涵蓋最重要的觀念以及初學甚至老手最易犯的錯誤。&lt;br /&gt;&lt;br /&gt;&lt;/font&gt;&lt;/p&gt;
   </description>
   <link>http://cobra.ee.ntu.edu.tw/lifetype/blog/clyde/35/2008/12/09/c-the-ten-commandments-for-newbie-c-programmers</link>
   <comments>http://cobra.ee.ntu.edu.tw/lifetype/blog/clyde/35/2008/12/09/c-the-ten-commandments-for-newbie-c-programmers</comments>
   <guid>http://cobra.ee.ntu.edu.tw/lifetype/blog/clyde/35/2008/12/09/c-the-ten-commandments-for-newbie-c-programmers</guid>
      <dc:creator>clyde</dc:creator>
      
    <category>電腦</category>
         <pubDate>Tue, 09 Dec 2008 11:06:30 +0800</pubDate>
   <source url="http://cobra.ee.ntu.edu.tw/lifetype/rss.php?blogId=7&amp;profile=rss20">clyde</source>
     </item>
    <item>
   <title>一個不錯的rpm網站</title>
   <description>
    &lt;p&gt;這個管理支援度都不錯，蠻推的。網站位址如下：&lt;/p&gt;&lt;p&gt;http://rpm.livna.org/rlowiki/&amp;nbsp;&lt;/p&gt;
   </description>
   <link>http://cobra.ee.ntu.edu.tw/lifetype/blog/clyde/35/2008/06/01/rpm</link>
   <comments>http://cobra.ee.ntu.edu.tw/lifetype/blog/clyde/35/2008/06/01/rpm</comments>
   <guid>http://cobra.ee.ntu.edu.tw/lifetype/blog/clyde/35/2008/06/01/rpm</guid>
      <dc:creator>clyde</dc:creator>
      
    <category>電腦</category>
         <pubDate>Sun, 01 Jun 2008 14:38:51 +0800</pubDate>
   <source url="http://cobra.ee.ntu.edu.tw/lifetype/rss.php?blogId=7&amp;profile=rss20">clyde</source>
     </item>
    <item>
   <title>如何在fedora core 9上播放rmvb或是rm檔影片</title>
   <description>
    我是安裝RealPlayer11GOLD.rpm，安裝完畢後還要在安裝alsa-oss套件，接下來打開realplayer，請到Tools-&amp;gt;Preferences-&amp;gt;Hardware-&amp;gt;將使用Use Xvideo給取消掉，將Audio driver選擇OSS。按ok離開後，重新啟動realplayer，但是記得要用aoss realplay這個指令來啟動，這樣就可以順利播放rmvb或rm檔案了！
   </description>
   <link>http://cobra.ee.ntu.edu.tw/lifetype/blog/clyde/35/2008/05/29/fedora-core-9-rmvb-rm</link>
   <comments>http://cobra.ee.ntu.edu.tw/lifetype/blog/clyde/35/2008/05/29/fedora-core-9-rmvb-rm</comments>
   <guid>http://cobra.ee.ntu.edu.tw/lifetype/blog/clyde/35/2008/05/29/fedora-core-9-rmvb-rm</guid>
      <dc:creator>clyde</dc:creator>
      
    <category>電腦</category>
         <pubDate>Thu, 29 May 2008 20:33:44 +0800</pubDate>
   <source url="http://cobra.ee.ntu.edu.tw/lifetype/rss.php?blogId=7&amp;profile=rss20">clyde</source>
     </item>
    <item>
   <title>解決 firefox上播放flash檔案沒聲音的問題！</title>
   <description>
    &lt;p&gt;當安裝完flash播放檔之後，雖然可以看到flash了，但是播放出來卻沒有聲音，此時還要再多加裝一個package，那就是 libflashsupport (yum install libflashsupport)，就可以讓flash播放出聲音。&lt;/p&gt;
   </description>
   <link>http://cobra.ee.ntu.edu.tw/lifetype/blog/clyde/35/2008/05/29/firefox-flash</link>
   <comments>http://cobra.ee.ntu.edu.tw/lifetype/blog/clyde/35/2008/05/29/firefox-flash</comments>
   <guid>http://cobra.ee.ntu.edu.tw/lifetype/blog/clyde/35/2008/05/29/firefox-flash</guid>
      <dc:creator>clyde</dc:creator>
      
    <category>電腦</category>
         <pubDate>Thu, 29 May 2008 12:50:16 +0800</pubDate>
   <source url="http://cobra.ee.ntu.edu.tw/lifetype/rss.php?blogId=7&amp;profile=rss20">clyde</source>
     </item>
    <item>
   <title>xfig 3.2.5 SIGSEGV abort</title>
   <description>
    &lt;p&gt;在安裝 xfig 於 fedora core 9 上時，安裝完畢之後，執行 xfig時候出現錯誤：&lt;/p&gt;&lt;p&gt;&lt;span&gt;xfig 3.2.5 SIGSEGV abort&lt;/span&gt;&lt;/p&gt;&lt;p&gt;於是搜尋了一下google找到有類似的問題，那就是fedora core 9的XAW3D問題，因為版本的不一樣，導致xfig啟動完後之後，執行失敗，兩個可以解決的辦法：&lt;/p&gt;&lt;p&gt;1. 在Imakefile中將 #define XAW3D功能關閉！然後，xmkmf ; make即可。&lt;/p&gt;&lt;p&gt;2.或是在fedora core 9 下安裝XAW3D(但是fedora core 9本身就已經安裝最新的XAW3D1.5E以上版本)，所以變成是降版本。 &lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;
   </description>
   <link>http://cobra.ee.ntu.edu.tw/lifetype/blog/clyde/35/2008/05/24/xfig-3.2.5-sigsegv-abort</link>
   <comments>http://cobra.ee.ntu.edu.tw/lifetype/blog/clyde/35/2008/05/24/xfig-3.2.5-sigsegv-abort</comments>
   <guid>http://cobra.ee.ntu.edu.tw/lifetype/blog/clyde/35/2008/05/24/xfig-3.2.5-sigsegv-abort</guid>
      <dc:creator>clyde</dc:creator>
      
    <category>電腦</category>
         <pubDate>Sat, 24 May 2008 14:50:47 +0800</pubDate>
   <source url="http://cobra.ee.ntu.edu.tw/lifetype/rss.php?blogId=7&amp;profile=rss20">clyde</source>
     </item>
    <item>
   <title>recurrence analysis</title>
   <description>
    &lt;p&gt;The standard Divide-and-Conquer algorithm usually works as follows:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;spend some time handling the base case&lt;/li&gt;&lt;li&gt;if not at the base case, divide the problem up into smaller subproblems:  		D(n)&lt;/li&gt;&lt;li&gt;make recursive calls to handle all the subproblems created on step 2:  		T(n/b)&lt;/li&gt;&lt;li&gt;combine results created by recursive calls on step 3: C(n)&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;利用遞迴分析：&amp;nbsp;&lt;/p&gt;&lt;p&gt;T(n) = a * T(n/b) + f(n)&lt;/p&gt;&lt;ol&gt;&lt;li&gt;a = number of subproblems&lt;/li&gt;&lt;li&gt;n/b = size of the subproblems&lt;/li&gt;&lt;li&gt;f(n) = D(n) + C(n)&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;以Max-Heapify為例來分析：&lt;/p&gt;&lt;ol&gt;&lt;li&gt;a = 1, i.e., there is only one recursive call made&lt;/li&gt;&lt;li&gt;n/b = (2/3) * n, is the worst case size of the one subproblem. The size of the left subtree is (2/3) * n. 也就是說 when the left subtree has one entire full level as                 compared to the right subtree. The worst case is when the last level of the tree is half                 full.&lt;/li&gt;&lt;li&gt;f(n) = &lt;font face=&quot;Symbol&quot;&gt;Q&lt;/font&gt;(1), all the work done in lines 1 - 9 above takes a             constant time&lt;/li&gt;&lt;li&gt;T(n) = T(2n/3) + &lt;font face=&quot;Symbol&quot;&gt;Q&lt;/font&gt;(1)&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Max-Heapify演算法如下:&lt;/p&gt;&lt;p&gt;Max-Heapify(A,i)&lt;br /&gt;1 l &amp;larr; Left(i)&lt;br /&gt;2 r &amp;larr; Right(i)&lt;br /&gt;3 if l &amp;le; heap-size[A] and A[l] &amp;gt; A[i]&lt;br /&gt;4 then largest &amp;larr; l&lt;br /&gt;5 else largest &amp;larr; i&lt;br /&gt;6 if r &amp;le; heap-size[A] and A[r] &amp;gt; A[largest]&lt;br /&gt;7 then largest &amp;larr; r&lt;br /&gt;8 if largest &amp;ne; i&lt;br /&gt;9 then exchange A[i] &amp;harr; A[largest]&lt;br /&gt;10 Max-Heapify(A, largest) &lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;
   </description>
   <link>http://cobra.ee.ntu.edu.tw/lifetype/blog/clyde/35/2008/04/16/recurrence-analysis</link>
   <comments>http://cobra.ee.ntu.edu.tw/lifetype/blog/clyde/35/2008/04/16/recurrence-analysis</comments>
   <guid>http://cobra.ee.ntu.edu.tw/lifetype/blog/clyde/35/2008/04/16/recurrence-analysis</guid>
      <dc:creator>clyde</dc:creator>
      
    <category>電腦</category>
         <pubDate>Wed, 16 Apr 2008 11:50:57 +0800</pubDate>
   <source url="http://cobra.ee.ntu.edu.tw/lifetype/rss.php?blogId=7&amp;profile=rss20">clyde</source>
     </item>
    <item>
   <title>如何使用latex在網頁上顯示方程式</title>
   <description>
    &lt;p&gt;&lt;a href=&quot;http://www.codecogs.com/components/equationeditor/equationeditor.php&quot;&gt;CodeCogs - Latex Equation Editor&lt;/a&gt;&lt;/p&gt;&lt;p&gt;利用CodeCogs提供 Latex Equation Editor來線上顯示方程式：&lt;/p&gt;&lt;p&gt;在HTML中插入&amp;nbsp;&lt;/p&gt;&lt;p&gt; &amp;lt;img src=&amp;quot;http://www.codecogs.com/eq.latex?p\in \cal{P} \rm{\ and\ } t\in T&amp;quot; /&amp;gt; &lt;/p&gt;&lt;p&gt;會顯示如下:&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;http://www.codecogs.com/eq.latex?p\in \cal{P} \rm{\ and\ } t\in T&quot; border=&quot;0&quot; /&gt;&lt;/p&gt;
   </description>
   <link>http://cobra.ee.ntu.edu.tw/lifetype/blog/clyde/35/2008/04/14/latex</link>
   <comments>http://cobra.ee.ntu.edu.tw/lifetype/blog/clyde/35/2008/04/14/latex</comments>
   <guid>http://cobra.ee.ntu.edu.tw/lifetype/blog/clyde/35/2008/04/14/latex</guid>
      <dc:creator>clyde</dc:creator>
      
    <category>電腦</category>
         <pubDate>Mon, 14 Apr 2008 12:50:20 +0800</pubDate>
   <source url="http://cobra.ee.ntu.edu.tw/lifetype/rss.php?blogId=7&amp;profile=rss20">clyde</source>
     </item>
    <item>
   <title>將 Fig 1 : xxxx 中的 &quot;:&quot;拿掉的latex code</title>
   <description>
    &lt;p&gt;\makeatletter&lt;br /&gt;\long\def\@makecaption#1#2{%&lt;br /&gt;\vskip\abovecaptionskip&lt;br /&gt;\sbox\@tempboxa{#1\quad #2}%&lt;br /&gt;\ifdim \wd\@tempboxa &amp;gt;\hsize&lt;br /&gt;&amp;nbsp; #1\quad #2\par&lt;br /&gt;\else&lt;br /&gt;&amp;nbsp; \global \@minipagefalse&lt;br /&gt;&amp;nbsp; \hb@xt@\hsize{\hfil\box\@tempboxa\hfil}%&lt;br /&gt;\fi&lt;br /&gt;\vskip\belowcaptionskip}&lt;br /&gt;\makeatother&lt;/p&gt;&lt;p&gt;&amp;nbsp;從大陸網站ctex中看到的&lt;/p&gt;
   </description>
   <link>http://cobra.ee.ntu.edu.tw/lifetype/blog/clyde/35/2007/03/24/fig-1-xxxx-latex-code</link>
   <comments>http://cobra.ee.ntu.edu.tw/lifetype/blog/clyde/35/2007/03/24/fig-1-xxxx-latex-code</comments>
   <guid>http://cobra.ee.ntu.edu.tw/lifetype/blog/clyde/35/2007/03/24/fig-1-xxxx-latex-code</guid>
      <dc:creator>clyde</dc:creator>
      
    <category>電腦</category>
         <pubDate>Sat, 24 Mar 2007 11:36:09 +0800</pubDate>
   <source url="http://cobra.ee.ntu.edu.tw/lifetype/rss.php?blogId=7&amp;profile=rss20">clyde</source>
     </item>
    <item>
   <title>隨身碟病毒排除方式</title>
   <description>
    &lt;span style=&quot;font-size: 10pt; color: #444444; font-family: 新細明體&quot;&gt;&lt;span&gt;&lt;font face=&quot;times new roman,times&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;span style=&quot;font-size: 10pt; color: #444444; font-family: 新細明體&quot;&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;最近在工作當中常會看到一個以隨身碟上的autorun.inf檔案為媒介到處傳播的病毒&lt;br /&gt;在使用NOD32掃瞄後會看到這個病毒叫/win32/Small.R&lt;br /&gt;受到感染的電腦掃瞄出來會看到下面的一些檔案：&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: #444444; font-family: 新細明體&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: #444444; font-family: 新細明體&quot;&gt;&lt;span&gt;&lt;br /&gt;中了隨身碟病毒的病徵：&lt;br /&gt;1.隨身碟或C磁碟機用點選兩下會打不開。&lt;br /&gt;解決方法：在我的電腦或檔案總管點選資料夾的圖來開啟。&lt;br /&gt;2.在工作管理員中的處理程序中會看到影像名稱為svchost.exe、使用者名稱為user的項目。工作管理員按ctrl+alt+del&lt;br /&gt;或滑鼠移到時鐘上方按右鍵也可以看見&lt;br /&gt;3.在隨身碟中會存在autorun.inf、Recycled的隱藏檔及目錄，而RECYCLED中為存在著一個INFO.EXE的檔案，windows&lt;br /&gt;預設會看不到這些隱藏檔和目錄，此時要修改一下設定。&lt;br /&gt;作法：開啟我的電腦或檔案總管，選取工具---&amp;gt;資料夾選項&lt;br /&gt;再點選檢視，找到下列三個選項：&lt;br /&gt;a.隱藏已知檔案類型的副檔名&lt;br /&gt;b.隱藏保護的作業系檔案&lt;br /&gt;c.顯示所有檔案和資料夾&lt;br /&gt;在隨身碟中看到autorun.inf及Recycled後把它刪除就可以了。&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: #444444; font-family: 新細明體&quot;&gt;&lt;span&gt; &lt;p&gt;其實它是之前隨身碟病毒Inetsrv的變種板本&lt;br /&gt;它會在使用者的電腦c:\windows\system\的目錄中製造一個目錄名叫_SV_CMD_&lt;br /&gt;目錄當中會存在一個_U_.EXE的執行檔，基本_SV_CMD_資料夾和_U_.EXE檔也都是隱藏檔找到後一樣刪除即可。&lt;/p&gt;&lt;p&gt;如果想透過命令提示字元視窗清除_SV_CMD_目錄以及_U_.EXE檔案&lt;br /&gt;在開始---&amp;gt;執行中輸入cmd&lt;br /&gt;接著依照下面的圖示到\windows\system\下作業&lt;br /&gt;因為它們是隱藏的所以用dir的指令會找不到要用attrib來找才行&lt;br /&gt;c:&lt;br /&gt;cd \%windir%\system\&lt;br /&gt;attrib -r -h -s svchost.exe&lt;br /&gt;del svchost.exe&lt;br /&gt;attrib -r -h -s *.*&lt;br /&gt;cd _SV_CMD_&lt;br /&gt;attrib -r -h -s *.*&lt;br /&gt;del _U_.EXE&lt;br /&gt;cd ..&lt;br /&gt;rd _SV_CMD_&lt;/p&gt;&lt;p&gt;&lt;br /&gt;要預防這種透過autorun.inf的隨身碟病毒最好的方式還是關閉電腦中的autorun功能&lt;br /&gt;關閉的方法如下請到開始---&amp;gt;執行中輸入gpedit.msc進入windows的群組原則當中去修改&lt;br /&gt;電腦設定---&amp;gt;系統管理範本---&amp;gt;系統---&amp;gt;右邊視窗中的關閉自動播放&lt;br /&gt;在關閉自動播放---&amp;gt;已啟用---&amp;gt;停用自動播放在---&amp;gt;所有磁碟機---&amp;gt;套用---&amp;gt;確定&lt;/p&gt;&lt;p&gt;&amp;nbsp;資料來源：&lt;a href=&quot;http://www.wretch.cc/blog/flikkao2&amp;amp;article_id=5792722&quot;&gt;http://www.wretch.cc/blog/flikkao2&amp;amp;article_id=5792722&lt;/a&gt;&lt;/p&gt;&lt;/span&gt;&lt;/span&gt;
   </description>
   <link>http://cobra.ee.ntu.edu.tw/lifetype/blog/clyde/35/2007/01/13/</link>
   <comments>http://cobra.ee.ntu.edu.tw/lifetype/blog/clyde/35/2007/01/13/</comments>
   <guid>http://cobra.ee.ntu.edu.tw/lifetype/blog/clyde/35/2007/01/13/</guid>
      <dc:creator>clyde</dc:creator>
      
    <category>電腦</category>
         <pubDate>Sat, 13 Jan 2007 15:23:18 +0800</pubDate>
   <source url="http://cobra.ee.ntu.edu.tw/lifetype/rss.php?blogId=7&amp;profile=rss20">clyde</source>
     </item>
   </channel>
</rss>