我們的計算器程序,用1234對應加減乘除,對於人閱讀很產生一點障礙。隔一個月後再看此代碼可能想不起是0123還是1234了,還得去代碼中查找,如果能為代表四則運算的四個數取個有意義的別名就好了,一看是知道對應什麼。沒問題,用宏啊。以下是我們的計算器程序第五版:
http://hovertree.com/menu/cpp/
//定義四則運算的宏 #define JIA 1 #define JIAN 2 #define CHENG 3 #define CHU 4 int main(void) { //保存用戶輸入的數 int number1; int number2; int opt;//運算符 //提示用戶輸入第一個數: printf("請輸入第一個數:\n"); int r =scanf("%d",&number1); //查看Scanf是否收到了正確的數 if(r==0){ printf("別調皮,這樣不好玩,我走了\n"); //程序退出 return 0; } // 何問起 hovertree.com //提示用戶輸入第二個數 printf("請輸入第二個數:\n"); r = scanf("%d",&number2); if(r==0){ printf("別調皮,這樣不好玩,我走了\n"); //程序退出 return 0; } //提示用戶輸入運算符 printf("請輸入運算符(%d%d%d%d分別對應加減乘除):\n",JIA,JIAN,CHENG,CHU); r = scanf("%d",&opt); if(r==0){ printf("運算符也是數字,別搞錯好嗎?你這樣讓我怎麼混? 我走了\n"); //程序退出 return 0; } //程序運行到這裡說明兩次輸入都正確 int result;//存放計算結果 //跟據運算符進行不同的運算 switch(opt){ case JIA: //加 result = number1+number2; break; case JIAN: //減 result = number1-number2; break; case CHENG: //乘 result = number1*number2; break; case CHU: //除,現在只能整除 result = number1/number2; break; default: printf("運算符必須是1,2,3,4之一才行!走了\n"); return; //退出 } //輸出結果 printf("%d+%d = %d\n",number1,number2,result); return 0; }
宏名習慣性全部大寫,定義宏不需要分號結束。宏的實質就是替換。在編譯時,第一步就是把代碼中的宏用實際的值代替。用宏還一個好處,當你把宏對值改動的話,程序其余地方不用動。比如你可以把1234,改成0123,程序照樣運行不出錯。
但是,除了宏之外,還可以使用枚舉。如是:
enum OPT{ jia = 1, jian, cheng, chu }; int main(void) { //保存用戶輸入的數 int number1; int number2; int opt;//運算符 //提示用戶輸入第一個數: printf("請輸入第一個數:\n"); int r =scanf("%d",&number1); //查看Scanf是否收到了正確的數 if(r==0){ printf("別調皮,這樣不好玩,我走了\n"); //程序退出 return 0; } //提示用戶輸入第二個數 printf("請輸入第二個數:\n"); r = scanf("%d",&number2); if(r==0){ printf("別調皮,這樣不好玩,我走了\n"); //程序退出 return 0; } //提示用戶輸入運算符 printf("請輸入運算符(%d%d%d%d分別對應加減乘除):\n",jia,jian,cheng,chu); r = scanf("%d",&opt); if(r==0){ printf("運算符也是數字,別搞錯好嗎?你這樣讓我怎麼混? 我走了\n"); //程序退出 return 0; } // 何問起 hovertree.com //程序運行到這裡說明兩次輸入都正確 int result;//存放計算結果 //跟據運算符進行不同的運算 switch(opt){ case jia: //加 result = number1+number2; break; case jian: //減 result = number1-number2; break; case cheng: //乘 result = number1*number2; break; case chu: //除,現在只能整除 result = number1/number2; break; default: printf("運算符必須是1,2,3,4之一才行!走了\n"); return; //退出 } //輸出結果 printf("%d+%d = %d\n",number1,number2,result); return 0; }
枚舉有名字,我們這個枚舉叫OPT。枚舉雖然看起來像結構,但是枚舉與結構完全不是一回事。枚舉的每一項就是為一個整數取了個名字,每一項都是一個常量,而不是的成員變量。枚舉的用處更像是把表示某種東西的相關值組織到一起,而宏就做不到了。比如四則運算的宏,每一項都可以隨意找位置放,它們不緊鄰也沒有語法錯誤。而枚舉是強制把相關的項放在一起。
枚舉的項的名字一般不大寫,當然你可以像宏一樣大寫。只要你整個工程中都能堅持統一的風格就行了。
http://www.cnblogs.com/roucheng/p/cpp11.html