1. 乙個識別符號被巨集定義後,該識別符號便是乙個巨集名。這時,在程式中出現的是巨集名,在該程式被編譯前,先將巨集名用被定義的字串替換,這成為巨集替換,替換後才進行編譯,
巨集替換是簡單的替換
2. #include
#define n 2
int main(int argc,char**argv)
這段程式執行結果為 4.但是假如把 n巨集定義為 2+2;那麼執行結果該是多少呢?是16麼;
#include
#define n 2
int main(int argc,char**argv)
顯然執行結果不是16,而是8,為什麼會出現這種情況呢,這是因為c語言的巨集定義只是簡單的替換,他遵循,先替換,再計算的原則
實際計算的式子為 2+2*2+2
如果想要出現16,需要這麼寫
#include
#define n (2+2)
int main(int argc,char**argv)
3. 使用巨集定義函式時,同樣需要注意這個問題,如下**所示,執行的結果是16麼?
#include
#define area(x) x*x
int main(int argc,char**argv)
顯然執行的結果不是16,而是8. 同樣的道理,在寫巨集定義函式時,引數的表達也要加上();
如下#include
#define area(x) (x)*(x)
int main(int argc,char**argv)
4. 使用巨集定義函式除了要注意引數要加()外,還需注意一點,在上邊程式的基礎上,假如計算的是 area(2+2)/area(2+2);
計算結果是1麼?經驗證,不是,結果為16,還是以簡單替換的原則,不加任何符號,分析一下,發現,實際的計算公式為
(2+2)*(2+2)/(2+2)*(2+2);根據加減乘除運算可得結果為16;
那為了讓他結果為1 ,應該怎麼寫呢?**如下
#include
#define area(x) ((x)*(x))
int main(int argc,char**argv)
所以總結: 用巨集定義時,含引數時,引數本身要加(),此外,對引數的操作整體也要加()。
巨集定義的注意事項
巨集定義不是函式,它只是不同形式的替換而已,不同於函式的引數巨集定義的引數 暫且稱之為引數 不是作為乙個整體參與計算的,如下例子所示 include using namespace std define fun1 x x x define fun2 x x x int fun3 int x int ...
C語言指標用法注意事項
計算機系統中有四個記憶體區域 1 棧 在棧裡面儲存一些我們定義的區域性變數以及形參 2 字元常量區 主要是儲存一些字元常量 3 全域性區 在全域性區里儲存一些全域性變數和靜態變數 4 堆 堆主要是通過動態分配的儲存空間,即以下講的講的動態分配記憶體空間。定義int型指標int p,p是用來儲存乙個位...
C語言巨集定義使用方法和注意事項
一 總結 1 預處理器直接對巨集進行文字替換 2 巨集使用時的引數不會進行求值和運算 3 預處理器不會對巨集定義進行語法檢查,巨集定義時出現的語法錯誤只能被編譯器檢測 4 巨集定義的效率高於函式呼叫 巨集不占用記憶體,函式占用記憶體 5 巨集的使用會帶來一定的 6 define定義的巨集可以出現在程...