1. 程式人生 > >成為C++高手之巨集與列舉

成為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++STLlower_bound()upper_bound()

標頭檔案:#include<algorithm> 如果   int a[100];            for(int i=1;i<=n;i++)              scanf("%d",&a[i]); lower_bound(a+

C++Primer4.6列舉讀書筆記

C++的enum工具提供了另一種建立符號常量的方式,這種方式可以代替const。它還允許定義新型別,但必須按照嚴格的限制進行。使用enum的句法與使用結構相似。例: enum spectrum{red,orange,yellow,green,blue,violet,indi

深入理解C語言——#define巨集列舉的區別

  (1)從處理過程的角度看: #define巨集是由編譯前處理器在預編譯處理時處理的,而且只做簡單的字串的替換。列舉常量則是在編譯的時候確定其值的。 (2)從除錯的角度看: 通常情況下,在編譯器裡,可以除錯列舉常量,而不能除錯巨集常量。 (3)從資料的型別看: #defi

c++面試staticconst的作用

一、static的作用(1)在函式體內,靜態變數具有“記憶”功能,一個被宣告為靜態的變數在這一函式被呼叫的過程中,其值維持不變;(2)函式體外,模組內,它的作用範圍是有限制的:靜態變數:該變數可以被模組內所有函式訪問,但不能被模組外其他函式訪問,是一個本地的全域性變數;靜態函

c++ primer變數基本型別

如果表示式裡既有帶符號型別又有無符號型別,當帶符號型別取值為負時會出現異常結果。因為帶符號數會自動轉換成無符號數。 unsigned u=10; int i=-42; std::cout<<i+i<<std::endl;//輸出-8

C++11threaddetach()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 =