列舉、巨集、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語言入門(廿二)之預處理指令、巨集、條件編譯、檔案包含、typedef、const
預處理指令 什麼是預處理指令: 在我們的檔案翻譯成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之 enum、sizeof、typedef(十一)
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中的路徑巨集 OutDir、ProjectDir、SolutionDir各種路徑含義
轉自 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