成為C++高手之巨集與列舉
巨集
我們的計算器程式,用1234對應加減乘除,對於人閱讀很產生一點障礙。隔一個月後再看此程式碼可能想不起是0123還是1234了,還得去程式碼中查詢,如果能為代表四則運算的四個數取個有意義的別名就好了,一看是知道對應什麼。沒問題,用巨集啊。以下是我們的計算器程式第五版:
//定義四則運算的巨集
#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;
}
//提示使用者輸入第二個數
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;
}
//程式執行到這裡說明兩次輸入都正確
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。列舉雖然看起來像結構,但是列舉與結構完全不是一回事。列舉的每一項就是為一個整數取了個名字,每一項都是一個常量,而不是的成員變數。列舉的用處更像是把表示某種東西的相關值組織到一起,而巨集就做不到了。比如四則運算的巨集,每一項都可以隨意找位置放,它們不緊鄰也沒有語法錯誤。而列舉是強制把相關的項放在一起。
列舉的項的名字一般不大寫,當然你可以像巨集一樣大寫。只要你整個工程中都能堅持統一的風格就行了。
相關推薦
成為C++高手之巨集與列舉
巨集 我們的計算器程式,用1234對應加減乘除,對於人閱讀很產生一點障礙。隔一個月後再看此程式碼可能想不起是0123還是1234了,還得去程式碼中查詢,如果能為代表四則運算的四個數取個有意義的別名就好了,一看是知道對應什麼。沒問題,用巨集啊。以下是我們的計算器
成為C++高手之指標與陣列
指標初步 定義一個指標變數:int * a=NULL; int 是指標的型別,其實應該說是指標指向的資料的型別。 程式執行時,資料都是放在記憶體中的,既然在記憶體中,就處於記憶體中的某個位置,這就是資料的地址。指標中儲存的就是這個地址。所以不論什麼型別的指標
成為C++高手之標頭檔案與條件編譯
但現在看起來真不爽,main.c依賴的檔案不能在工程中管理,要修改那些檔案的話麻煩大了。如何既能分成多個檔案又能在工程中看到呢?可以,使用標頭檔案(h檔案)。 標頭檔案中只放那些不產生記憶體佔用的程式碼,比如定義結構(定義結構不會產生記憶體分配,只有用結構
成為C++高手之第一個程式
選一個利器 工欲善其事,必先利其器。選一個好用又流行的的程式設計工具很重要。軟體程式設計工具現在都叫做IDE—–整合開發環境,能幫我們做很多事。有人願意手動寫makefile來自己管理原始檔,很好,但是makefile對新手來說跟天書一樣,很容易被打擊得沒興趣
成為C++高手之實戰專案
在記憶體中模擬出一副牌,然後模擬洗牌,發牌等動作。 流程是這樣的:構建一副牌儲存到一個數組中—洗牌—建立玩家—向玩家發牌–輸出每個玩家的牌。 #include <stdio.h> #include <stdlib.h> #includ
成為C++高手之函式
什麼是函式 我們寫的是程式,程式裡要有計算機能執行的指令,指令也叫程式碼。 程式碼放在哪裡呢?寫程式的時候,程式碼不能隨便放,必放在函式裡面。比如我們可以看到main這個函式,大括號裡就是程式碼。 系統啟動我們的程式後,首先執行的就是main函式裡的程式碼
C語言之指標與二維陣列
指標,其實就是地址,可以指向一塊自己分配大小的空間。陣列即是多塊一位的空間的線性排布。二維陣列,雖然在人文定義的感覺上有了面的理解,但實際在記憶體中也是一維的線性空間。 對於討論二維陣列,首先我們應該先討論一維陣列與
C++STL之lower_bound()與upper_bound()
標頭檔案:#include<algorithm> 如果 int a[100]; for(int i=1;i<=n;i++) scanf("%d",&a[i]); lower_bound(a+
C++Primer之4.6列舉讀書筆記
C++的enum工具提供了另一種建立符號常量的方式,這種方式可以代替const。它還允許定義新型別,但必須按照嚴格的限制進行。使用enum的句法與使用結構相似。例: enum spectrum{red,orange,yellow,green,blue,violet,indi
深入理解C語言——#define巨集和列舉的區別
(1)從處理過程的角度看: #define巨集是由編譯前處理器在預編譯處理時處理的,而且只做簡單的字串的替換。列舉常量則是在編譯的時候確定其值的。 (2)從除錯的角度看: 通常情況下,在編譯器裡,可以除錯列舉常量,而不能除錯巨集常量。 (3)從資料的型別看: #defi
c++面試之static與const的作用
一、static的作用(1)在函式體內,靜態變數具有“記憶”功能,一個被宣告為靜態的變數在這一函式被呼叫的過程中,其值維持不變;(2)函式體外,模組內,它的作用範圍是有限制的:靜態變數:該變數可以被模組內所有函式訪問,但不能被模組外其他函式訪問,是一個本地的全域性變數;靜態函
c++ primer之變數與基本型別
如果表示式裡既有帶符號型別又有無符號型別,當帶符號型別取值為負時會出現異常結果。因為帶符號數會自動轉換成無符號數。 unsigned u=10; int i=-42; std::cout<<i+i<<std::endl;//輸出-8
C++11thread之detach()與join()的函式對比
在宣告一個std::thread物件之後,都可以使用detach和join函式來啟動被調執行緒,區別在於兩者是否阻塞主調執行緒。 (1)當使用join()函式時,主調執行緒阻塞,等待被調執行緒終止,然後主調執行緒回收被調執行緒資源,並繼續執行; (2)當使用
學習Linux C程式設計之陣列與指標
1. 指標型別分析 分析指標,可以從變數名處起,根據運算子優先順序結合,一步一步分析. int p; //這是一個普通的整型變數 int *p; //首先從P處開始,先與*結合,所以說明P是一個指標,然後再與int結合,說明指標所指向的內容的型別為int 型.所以
成為Lua高手之metatable
離職後今天第一次去面試,結果遇到了全LUA的面試題,由於之前使用LUA的時候都是做的介面邏輯並沒有深入的學習,結果直接傻眼了,果斷吃癟。 記錄一下遇到的問題,拓展下自己的知識面。 原文地址 http://www.cnblogs.com/vokie/p/3640550.ht
【C/C++開發】C++之enum列舉量宣告、定義、使用與列舉類詳解與列舉類前置型別宣告
前面講到可以通過強制轉換將其他型別值賦給列舉變數:Weekday = enumType(2);這是合法的;但是Weekday = enumType(20);是非法的。這裡涉及列舉取值範圍的概念:列舉的上限是 大於最大列舉量的 最小的2的冪,減去1; 列舉的下限有兩種情況:一、列舉量的最小值不小於0,則列
C++之enum列舉量宣告、定義、使用與列舉類詳解
前面講到可以通過強制轉換將其他型別值賦給列舉變數:Weekday = enumType(2);這是合法的;但是Weekday = enumType(20);是非法的。這裡涉及列舉取值範圍的概念:列舉的上限是 大於最大列舉量的 最小的2的冪,減去1; 列舉的下限有兩種情況:一、列舉量的最小值不小於0,則列
Qt Quick 之 QML 與 C++ 混合編程具體解釋
ack world 避免 pub start 模板方法 另一個 一秒 gis Qt Quick 技術的引入。使得你能夠高速構建 UI ,具有動畫、各種絢麗效果的 UI 都不在話下。但它不是萬能的。也有非常多局限性,原來 Qt 的一些技術,比方低階的網絡編程如 Q
C++之編譯器與鏈接器工作原理
www 重復項 export 容易 區域 修改 direct 自身 默認 http://www.cnblogs.com/kunhu/p/3629636.html 原文來自:http://blog.sina.com.cn/s/blog_5f8817250100i3oz.htm
[js高手之路] dom常用節點屬性兼容性詳解與應用
asc 子元素 種類型 process 變色 tex 如果 結構 節點和 一、每個DOM節點都有一個nodeType屬性,表示節點類型, NodeType一共有12種類型,我們可以通過遍歷內置的Node構造函數獲取 1 window.onload =