K&R2心得//函數與程式結構

  1. K&R2心得//函數與程式結構

K&R2心得//函數與程式結構

原文連結: https://darkblack01.blogspot.com/2011/03/k_23.html
移植時的最後更新日期: 2015-12-23T14:16:57.697+08:00

翻譯問題
回傳值的資料型態(return-type)→傳回值之型別
省略→略去



P.4-5
最簡函數
dummy( ){ }
P.4-6

當回傳值的資料型態省略時,預設為int型態
任何運算式均可寫在return之後
1. 設計無return,coding無return,void 函數( )
2. 設計int函數( ),coding無return,程式執行權回到主程式,但無任何回傳值(不過証實,還是要看編譯器)
3. 設計int函數,程式執行結束方式有「有return」也有「無return」,程式回傳值可能為垃圾值。

P.4-7
主程式(main())有回傳值為某變數,在UNIX系統下就是執行該程式的shell
養成有「引數和資料型態」就寫「引數和資料型態」,沒「引數和資料型態」就寫「void」的良好習慣。

全域變數和區域變數的觀念
P.4-11

C不淮許在函數內再定義函數,所以任何函數本身都是全域存取函數。
在任何函數外部定義的變數,是全或存取變數

全域變數特性:「外部連結」特性
相同名稱必為相同的位置或函數,即使分開(不同檔案)編譯
(誇越檔案的分隔,每個函數都可以使用)
        如何定義只能在同一個原始檔案中使用的全域變數和函數(static)
使用時機:兩個不互相呼叫的函數,卻有共用的資料。
(資料就使用「全域變數」的方式呼叫,就可以利用「外部連結特性」產生「共用」的效果)

補充:
1. 一個「名稱的有效範圍」是指「程式中能使用該名稱的區域」(範圍=區域)
2. 區域變數:不同函數,不同變數,名稱相同也是不同變數。
3. 全域變數宣告時,最好可以給初值,如果是陣列時,最好可以給陣列大小。
4.標題檔的好處:共用訊息集中易於管理
(程式小:集中於一個標題檔;程式大;使用較多的標題檔。)

問:當程式大到要很多檔案時
如果依然使用全域變數則該變數有跨檔案的特性,但是要怎麼做才可以使全域變數失去跨檔案的作用呢?

靜態變數:各檔中的「永久的私人財產」,並不希望在其它檔中被使用。(達成限定範圍的要求)
        static int a;
全域變數中的靜態變數,不可存取。
特性:靜態區域變數提供函數內私有且永久的儲存位置。
區域存存性+全域存在性

暫存器變數:希望放在快取記憶體中,而非記憶體區段
        register int x;
特性:較快
用於常存取的變數。
缺點:無法取得變數位址。(無法取址的設定)

設定初值
全域變數、靜態變數宣告時預設初值 = 0,初值由coding時決定。
一般變數、暫存器變數宣告時則無預訊初值(無定義的垃圾值),初值可以由函式決定。

遞迴
很重要!看不懂!快速排序法
遞迴程式特性:
優點:程式簡潔、容易寫、容易讀,好維護。(會嗎?我看半天看不懂)
缺點:不節省記憶體空間(利用堆疊)。

前置處理器

抄入別的檔案

#include"filename"    程式檔所在的目錄找filename
#include    系統特定目錄找filename

替換單字
#define NAME ReplacementText
遇到NAME都替換成ReplacementText
兩行以上用(\)做為接續符號,才可以斷行。
有效範圍到原始檔案終止為止
替換單字不包含"裡的字

替換句子
#define max(A,B) ((A) > (B) ? (A) : (B))
A、B可為任何資料型態
A、B不可為運算式(會多算很多次)
若要替換"裡的文字,使用#
#define dprint(expr)  printf(#expr, expr);
不然用這一個仔例講解
#define dprint(expr)  printf(#expr" = %f", expr);
就是
dprint(pi)
變成
printf(“pi”" = %f", expr);

使用前置處理器時,引數中的(")要寫成("),而(\)要寫成(\)。
(##)代表接續:將兩個實際參數放在一起(中間沒有空格)

#define past(front, back)    front ## back
就是
past(na, me)
變成
name
##更多用法找附錄A

條件式(前置處理)
#if
#ifndef HDR       也可以寫成       #if !defined(HDR)
#endif



以下比較有無回傳值和傳入值(引數)的變化及用法
以預設回傳值和傳入值當作範例int

void 函數(void)  用來取代單一、重覆性高的Code,單純簡化程式碼的寫法
int  函數(void)  很少這麼用
void 函數(int)   用來取代功種、重覆性高的Code,單純簡化程式碼的寫法
int  函數(int)   對應、運算時使用