1. 程式人生 > >列舉、巨集、typedef

列舉、巨集、typedef

一、列舉型別的定義

1、基本資料型別

      >指標

      >空型別 void

      >構造型別:陣列、結構體、共用體

      在實際問題中,有些變數的取值被限定在一個有限的範圍內。例如,一個星期內只有七天,一年只有十二個月。如果把這些量說明為整體,字元型或其它型別顯然是不妥當的。

          C語言提供了一種稱為“列舉”的型別。在“列舉”型別的定義中列舉出所有可能的取值,被說明為該“列舉”型別的變數取值不能超過定義的範圍。

      應該說明的是,列舉型別是一種基本資料型別,而不是一種構造型別,因為它不能再分解為任何基本型別。

2、列舉型別的定義

      列舉型別定義的一般形式為:

                     enum   列舉型別名{列舉值1,列舉值2,列舉值3......};

在列舉值表中應羅列出所有可用值。這些值也稱為列舉元素。

例如:該列舉名為weekday,列舉值共有7個,即一週中的七天。凡被說明為weekday型別變數的取值只能是七天中的某一天。

       定義一個變數,儲存一週的第幾天

       enum  weekday{zhouyi,zhouer,zhousan,zhousi,zhouwu,zhouliu,zhouri};

3、列舉變數的定義和使用

      1>列舉型別變數

       如同結構和聯合一樣,列舉變數也可用不同的方式說明,即先定義後說明,同時定義說明或直接說明。設有變數a,b,c被說明為上述的weekday。

可採用下述任一種方式:

先定義列舉後定義列舉變數:

       enum  weekday{sun,mou,tue,wed,thu,fri,sat};

       enum  weekday  a, b, c;

或者

定義列舉的同時定義列舉變數

      enum  weekday{sun,mou,tue,wed,thu,fri,sat}a, b, c;

或者

用匿名的方式來定義列舉變數

      enum  {sun,mou,tue,wed,thu,fri,sat}a, b, c;

      2>列舉型別變數的初始化

      a=sun;

      b=tue;

      c=fri;

      3>列舉變數的使用

      printf("%d\n",a);

      說明:列舉型別定義完成以後,系統會自動給列舉的每個元素都會賦值一個整形的初值

      預設初值:從第一個元素開始值為0,以後各元素的值,是上一個元素的值+1

下面我們用例項來看看

列印如下:

總結:

         在列舉型別定義中,預設為nan的值為0

改進如下:

列印如下:

總結:

         在列舉型別定義中,進過我們設定nan的值為4

二、typedef關鍵字介紹

C語言中的結構型別:

          結構資料、空、構造、指標、定義型別

1、概念及語法格式

     C語言不僅提供了豐富的資料型別,而且還允許由使用者自己定義型別說明符,也就是說允許由使用者 為資料型別取 ”別名“

      typedef定義的一般形式為:

      typedef   原型別名    新型別名;

其中原型別名中含有定義部分,新型別名一般用大寫表示,以便於區別。

有時也可用巨集定義來代替typedef的功能,但是巨集定義是由預處理完成的

而typedef則是在編譯時完成的,後者更為靈活方便

2、typedef使用方法

     1>基本資料型別

例如,有整形量a、b、其說明如下:

           int  a,b;

其中  int 是整形變數的型別說明符。int 的完整寫法為 integer,為了增加程式的可讀性,可把整形說明符用typedef定義為:

          typedef   int  INTEGER

這以後就可用INTEGER來代替 int 作整形變數的型別說明了。

例如:

INTEGER   a, b;

等效於:

int   a, b;

        2>用在陣列,給陣列起別名

        typedef   int   sz[5];       //sz相當於具有了”陣列的功能“,

                                                sz定義的變數都是一個數組,並且長度為5,儲存的內容是int型別的

例如:

列印如下

        3>給結構體取別名

struct  person

{

          char  *name;

          int     age;

};

typedef   struct  person  p;  //這表明結構體person可以用 p來代替

//現在用p來定義一個結構體變數並且初始化

p  p1={"移動",10086};

例項如下

程式程式碼如下:

列印如下:

       4>給列舉型別取別名

//先定義列舉型別

enum  sex{nan,nv};

//給列舉型別起別名

typedef enum  sex  isex;

//用別名來定義列舉變數

isex  s1=nan;

例項如下:

程式程式碼如下:

列印如下:

       5>給函式指標起別名

//定義指標函式

int  (*p)(int ,int);

//給函式中的指標起別名

typedef   int  (*FUN)(int,int);   //這個別名FUN就像上面的陣列sz一樣具有相同的功效

用FUN定義的變數是一個函式指標變數

//定義函式指標變數

FUN  f1;

f1=jia;

例項如下:

列印如下:

三、預處理指令

1、基本概念

      以“#”號開頭的為預處理命令。如包含命令#include,巨集定義命令#define等。在源程式中這些命令都放在函式之外,而且一般都放在原始檔的前面,它們稱為預處理部分

       所謂預處理是指在進行編譯的第一遍掃描(詞法掃描和語法分析)之前所作的工作。預處理是C語言的一個重要功能,它由預處理程式負責完成。當對一個原始檔進行編譯時,系統將自動引用預處理程式對源程式中的預處理部分作處理,處理完畢自動進入對原程式的編譯。

       C語言提供了多種預處理功能,如巨集定義、檔案包含、條件編譯等。合理地使用預處理功能編寫的程式便於閱讀、修改、移植和除錯,也有利於模組化程式設計。

2、巨集的概念

      被定義為“巨集”的識別符號稱為“巨集名”。在編譯預處理時,對程式中所有出現的“巨集名”,都用巨集定義中的字串區代換,這稱為“巨集代換”或“巨集展開”。

      巨集定義是由源程式中的巨集定義命令完成的,巨集代換是由預處理程式自動完成的。在C語言中,“巨集”分為有引數和無引數兩種。

3、無引數巨集

      無引數巨集的巨集名後不帶引數。其定義的一般形式為:

      #define   識別符號    字串

      其中的“#”表示這是一條預處理命令。凡是以“#”開頭的均為預處理命令。“define”為巨集定義命令。“識別符號”為所定義的巨集名。“字串”可以是常量、表示式、字串等。

無引數巨集使用注意事項

    1>習慣上巨集名用大寫字母表示,以便於與變數區別。但也允許用小寫字母

    2>巨集定義是用巨集名來表示一個字串,在巨集展開時又以該字串取代巨集名,這只是一種簡單的代換,字串中可以含任何字元,可以是常數,也可以是表示式,預處理程式對它不作任何檢查。如有錯誤,只能在編譯已被巨集展開後的源程式時發現。

    3>巨集定義不是說明或語句,在行末不必加分號,如加上分號則連分號也一起置換

    4>巨集定義必須寫在函式之外,其作用域為巨集定義命令起到源程式結束。如要終結其作用域可使用#undef命令。

通過例項來看看巨集定義

程式如下:

列印如下:

下面我們進過改一下巨集定義看看效果

程式程式碼如下

列印如下:

總結:

         從上圖可以看出巨集定義是直接帶入展開,它並不會做任何檢查和運算

4、有參巨集定義

      C語言允許巨集帶有引數。在巨集定義中的引數稱為形式引數,在巨集呼叫中的引數稱為實際引數。

對帶引數的巨集,在呼叫中,不僅要展開,而且要用實參取去代換引數。

帶參巨集定義的一般形式為:

#define   巨集名(引數表)  字串

在字串中含有各個引數。

例項如下

程式程式碼如下

列印如下

5、有參巨集使用注意事項

     1>帶參巨集定義中,形參之間可以出現空格,但是巨集名和形參表之間不能有空格出現

     2>在帶參巨集定義中,形式引數不分配記憶體單元,因此不必作型別定義。而巨集呼叫中的實參有具體的值。要用它們去代換形參,因此必須作型別說明。這是與函式中的情況不同的。在函式中,形參和實參是兩個不同的量,各有自己的作用域,呼叫時要把實參值賦予形參,進行“值傳遞”。而在帶參巨集中,只是符號代換,不存在值傳遞的問題。

     3>在巨集定義中的形參是識別符號,而巨集呼叫中的實參可以是表示式

     4>在巨集定義中,字串內的形參通常要用括號括起來以避免出錯。

     5>巨集定義也可用來定義多個語句,在巨集呼叫時,把這些語句又代換到源程式內。

例題:

使用有參巨集實現判斷兩個數的大小

程式如下

列印如下

6、typedef 和#define 的區別

      #define 和 typedef 的區別

     應注意用巨集定義表示資料型別和用typedef定義說明符的區別。

             巨集定義只是簡單的字串代換,是在預處理完成的

          而typedef是在編譯時處理的,它不是作簡單的代換,而是對型別說明符重新命名。被命名的識別符號具有型別定義說明的功能

例項如下

程式如下

列印如下

總結:

        從這裡可以看出#define 和 typedef區別是很大的

        #define  INT1  int   //表示在程式中有INT1出現的地方用 int來代替

       typedef   int    INT   //表示 INT是int的另一個名字,INT具有int的功能

相關推薦

列舉巨集typedef

一、列舉型別的定義 1、基本資料型別       >指標       >空型別 void       >構造型別:陣列、結構體、共用體       在實際問題中,有些變數的取值被限定在一個有限的範圍內。例如,一個星期內只有七天,一年只有十二個月。如果把這

day10-列舉typedef巨集宣告

enum 先定義,後宣告 列舉類列舉類名 {變數名。。}; 列舉類列舉類名列舉變數名=宣告時; 以逗號隔開,沒有資料型別 輸出時只能是0,1,2,3等整數 定義時宣告 列舉類列舉類名 {資料型別,變數。。}列舉變數名 m; 匿名列舉直接定變數 列舉

C語言入門(廿二)之預處理指令巨集條件編譯檔案包含typedefconst

預處理指令 什麼是預處理指令: 在我們的檔案翻譯成0和1之前做的操作我們稱之為預處理指令。一般情況預處理指令都是以#號開頭的。 巨集定義的格式 不帶引數的巨集定義: #define 巨集名 值 巨集定義的作用:      

三十二python學習之Flask框架(四)模板:jinja2模板過濾器模板複用(繼承巨集包含)瞭解CSRF跨站請求攻擊

一、jinja2模板引擎的簡介: 1.模板: 1.1檢視函式的兩個作用: 處理業務邏輯; 返回響應內容; 1.3 什麼是模板: 模板其實是一個包含響應文字的檔案,不是特指的html檔案,其中用佔位符(變數)表示動態部分,告訴模板引擎其具體的

c語言的標頭檔案巨集指標

#include命令 #include是檔案包含命令,主要用來引入對應的標頭檔案。#include的處理過程很簡單,就是將標頭檔案的內容插入到該命令所在的位置,從而把標頭檔案和當前原始檔連線成一個原始檔,這與複製貼上的效果相同。#include有兩種使用方式: #include <stdio.h&g

kernel常用函式巨集結構體

1 __setup   在include/linux/init.h檔案中定義 #define __setup_param(str, unique_id, fn, early) \ static const ch

閱讀《大型網站技術架構:核心原理與案例分析》第五七章,結合《河北省重大技術需求征集系統》,列舉實例分析采用的可用性和可修改性戰術

定時 並不會 表現 做出 span class 硬件 進行 情況   網站的可用性描述網站可有效訪問的特性,網站的頁面能完整呈現在用戶面前,需要經過很多個環節,任何一個環節出了問題,都可能導致網站頁面不可訪問。可用性指標是網站架構設計的重要指標,對外是服務承諾,對內是考核指

C之 enumsizeoftypedef(十一)

C語言 enum sizeof typedef 在 C 語言中經常會見到 enum、sizeof、typedef,那麽我們今天就來講解下它們三個。 首先 enum 是 C 語言中的一種自定義類型,它是一種枚舉類型。enum 值是可以根據需要自定義的整型值,第一個定

Sass之混合巨集繼承佔位符

  1、混合巨集。     當樣式變得越來越複雜,需要重複使用大段的樣式時,使用變數就無法達到我們目的了。這個時候混合巨集就派上用場了。   而使用混合巨集時,首先要宣告混合巨集,而宣告混合巨集時有兩種,不帶引數混合巨集和帶引數混合巨集兩種。   1.1 不帶引數混合巨集的宣告要使用關鍵詞@mixin。

java之單例模式:餓漢式懶漢式雙重校驗鎖列舉靜態內部類

一、餓漢式: /** * 餓漢式: * 不存在多執行緒同步問題,當類被載入時,初始化並分配記憶體空間; * 當類被解除安裝時,才釋放所佔記憶體,因此在某些特定條件下會耗費記憶體。 * * @author: Rodge * @time: 2018年10月4日 下午4:35:12 * @

C/C++之巨集行內函數和普通函式的區別

轉載:https://www.cnblogs.com/ht-927/p/4726570.html C/C++之巨集、行內函數和普通函式的區別 行內函數的執行過程與帶引數巨集定義很相似,但引數的處理不同。帶引數的巨集定義並不對引數進行運算,而是直接替換;行內函數首先是函式,這就意味著函式的很多

Excel 批量快速合併相同的單元格:資料透視表巨集程式碼分類彙總

  Excel 批量快速合併相同的單元格   在製作Excel表格的時候,為了使得自己製作的報表更加簡潔明瞭,方便查閱,經常需要合併很多相同的單元格,如果有幾千幾萬條記錄需要合併的話,真的會讓

const 指標 #define typedef 區別於詳解

目錄   1.const指標詳解:   2.#define、const、typedef預處理詳解 1.const指標詳解: ① const  int   *   p;    &n

C++列舉結構共用體

一、列舉 enum typename {識別符號[=整型常數],...}; 作用:自定義值域;增加程式碼可讀性 從語法角度看,列舉元素是命名常量,列舉元素沒有賦初值的話實際值為0,1...沒有指定值的列舉元素,其值為前一元素加 1 從應用角度看,可以將列舉元素看作字面常量

馬雲李彥巨集劉強東都看好的網際網路眾籌 或將亡矣

@央廣軍事11月10日訊息,2018中國航展上首次公開展出的“瞭望者Ⅱ”察打一體導彈無人艇,是剛剛成功進行首發導彈飛行試驗命中靶心的實艇,試驗成功後隨即吊裝到展位與公眾見面。據媒體此前報道,該艇是中國第一艘導彈無人艇,也是繼以色列拉斐爾海上騎士後全球第二個成功發射導彈的無人艇,填補了國內導彈無人艇這一技術空白

word巨集巨集程式設計以及VBA

整理自網路   word巨集是什麼呢? 巨集是一個批量處理程式命令,正確地運用它可以提高工作效率。微軟的office軟體允許使用者自己編寫,叫VBA的指令碼來增加其靈活性,進一步擴充它的能力。 如完成一個一開啟word檔案同時要開啟某個檔案的功能,必須要自己編寫一段稱之為巨

Python 分支迴圈條件列舉

對於表示式,分為“左結合”和“右結合” 左結合:對於沒有 = 號的,從左到右邊,當然要考慮優先順序。 右結合:對於有 = 號存在的情況,右邊的自成一體,然後賦值給左邊變數   優先順序: 邏輯運算子的優先順序: not > and > or

巨集 模板

前處理器在編譯之前,根據程式設計師的指示決定要編譯的內容。 巨集 巨集定義一般有兩種,定義函式和常量 當文中用到較多相同的常量時:應該用巨集定義 在巨集定義函式時:應該多用括號。 使用巨集避免多次包含 1 c++的標頭檔案一般用來宣告函式和類,若有一個class2類要用到class1

[轉]VS中的路徑巨集 OutDirProjectDirSolutionDir各種路徑含義

轉自 http://blog.csdn.net/restraint/article/details/39934401   說明 $(RemoteMachine) 設定為“除錯”屬性頁上“遠端計算機”屬性的值。有關更多資訊,請參見更改用於 C/C++ 除錯配置的專案設定。

列舉字串值之間的轉換

public enum Fruit {     banana=1,     apple=2,     orange=3 } //列舉轉字串 string enumString=Enum.GetName( typeof(Fruit) ,f