程式設計 微知識(二) 函式(function)與巨集(macro)

#define 會建立"巨集"(Macro),定義巨集之後,編譯器就可以使用語彙字元字串用來替代原始程式檔中出現的每個識別項,macro是在前置處理器(preprocessor)處理的。

函式(Function)是執行某項程式碼區塊。函式可以自己定義參數來讓呼叫端將引數傳遞給函式。函式也可以選擇性的傳回值來當作其輸出,function是在編譯器(compiler)處理的。

本文以C++實作執行介紹。

#define指示詞定義語法如下:

語法
#define identifier token-string opt
#define identifier ( identifier opt , ... , identifier opt ) token-string opt

這邊要注意的事情是,Macro只是讓你自訂的token-string 替代原始程式檔中出現的每個 identifier,也就是巨集的本質上只是一種文字的替換,所以可能會造成運算子的優先順序錯亂。如果你要定義類似函式且具有參數的Macro的話必須以括號括住,


問題一:

試寫出一個Macro求出兩數之最大值:

#define MAX(A,B) ( (A) >= (B) )? (A) :(B) )

問題二:

#define SUM(a,b) a+b ,  若是 SUM(3,5)*6 的答案是什麼?

 SUM(3,5)*6 = 3+5*6 = 33

實作程式碼如下:

#include <iostream>
#define MAX(A,B) ( (A) >= (B) )? (A) :(B) )
#define SUM(a,b) a+b 
using namespace std;

int main() {

	cout << "SUM(3,5)*6 = " << SUM(3, 5) * 6<< endl;

	cout << "MAX(53,-6) = "<< (MAX(53,6) << endl;

	system("pause");
	return 0;
}

執行結果如下:

函式可以有回傳值 (return value) ,也可以沒有回傳值,但是沒有回傳的函數要宣告為void。以及每個c++的return只能回傳一個值。有回傳值的函數要明確宣告回傳值的型態 (type) ,最後要加上 return 陳述, return 為關鍵字 (keyword) 之一,用來回傳數值。

語法如下:

return-type function_name(parameter-list) {
    // function_body
 
    return return-value;
}

實作程式碼如下:

#include <iostream>
using namespace std;

int add(int, int);
void print(int);
int max(int, int);

int main() {



	cout << "add(3,5)*6 = " << add(5, 6)*6 << endl;

	cout << "max(53,-6) = " << max(53, -6) << endl;

	cout << "print(666) = ";
	
	print(666);

	system("pause");
	return 0;
}

int add(int n1, int n2)
{
	return (n1 + n2);
}

void print(int result)
{
	cout << result<<endl;
}

int max(int n1, int n2)
{
	return (n1 >= n2 ? n1 : n2);
}

執行結果如下:

巨集(macro)和函式(function)的比較

函式是拿時間換取空間的,透過執行時期在函式堆疊的切換,相同邏輯區塊只要抽出成為函式,則大家共用同一份程式即可(在記憶體中只有一份實體,較節省記憶體空間)。函式實務上還有另一個好處是可以取得函式位址,也就是說可以把函式當參數。

而巨集則是拿空間換取時間,在編譯之前,前置處理器就將該程式替換至各個呼叫區塊,所以相同的邏輯在會重複出現在各個地方,但是由於執行時間不需要在函式堆疊切換,減少時間的耗損。

參考文章:

http://blog.burn-i.com/?p=175

有夢最美 築夢踏實

活在當下 認真過每一天

我是阿夢 也是Ace