枚舉是編程人員自己定義的一種基本數據類型,這種類型的變量只能取枚舉中的值,好處就是能夠防止變量的錯誤賦值。用法:enum 類型名{變量1,變量2,變量3,...}
C語言中宏定義是定義在程序頭部,作預處理用,有無參和有參兩種,可以看作是一個過程的調用,與函數調用不一樣,不涉及入棧出棧問題,調用速度快。用法:#define 替換名 原名
宏定義示例1:
# include <stdio.h>
#define DD "%d" //宏定義,在以下書寫中可用DD代替"%d"。
int main(void)
{
register int i;
i = 54321;
printf(DD"\n", i); //調用宏名,與下面語句效果一樣
printf("%d\n", i);
return 0;
}
宏定義示例2:
# include <stdio.h>
#define D "%d" //宏定義不是語句,後不需要加分號
#define P printf
#define swap(a, b) {int c; c=a; a=b; b=c;}
int main(void)
{
int i = 3;
int j = 5;
swap(i, j);
P("i = "D ", j =" D "\n", i, j); //含參數的宏定義類似於函數,根本上不同於函數,不存在函數的調用,運行速度快。
return 0;
}
枚舉示例1:
# include <stdio.h>
//定義枚舉常量類型,把一個事物所有可能的取值一一列舉出來,使此類型變量只能取列舉出的值。
enum WeekDay //WeekDay為新類型名
{
MonDay, TuesDay = -1, WednesDay, ThursDay, FriDay, SaturDay, SunDay
}; //列舉的枚舉常量,其實際值默認按順序依次為0, 1, 2, 3...,若在某常量上賦值,則其後值依次加1。
int main(void)
{
//int day; //定義一個星期變量,而定義為int類型,明顯不合適,因為星期變量是從星期一到星期天。
enum WeekDay day = FriDay;
printf("%d\n", day); //列舉的枚舉常量,其實際值默認按順序依次為0, 1, 2, 3...
return 0;
}
枚舉常量的值:
列舉的枚舉常量,其實際值默認按順序依次為0, 1, 2, 3...,若在某常量上賦值,則其後值依次加1。
# include <stdio.h>
enum WeekDay
{
MonDay, TuesDay, WednesDay, ThursDay, FriDay, SaturDay, SunDay
};
void f(enum WeekDay);
int main(void)
{
enum WeekDay day;
f(FriDay); //FriDay實際值是4
return 0;
}
void f(enum WeekDay i)
{
switch (i)
{
case 0:
printf("MonDay\n");
break;
case 1:
printf("TuesDay\n");
break;
case 2:
printf("WednesDay\n");
break;
case 3:
printf("ThursDay\n");
break;
case 4:
printf("FriDay\n");
break;
case 5:
printf("SaturDay\n");
break;
case 6:
printf("SunDay\n");
break;
}
return;
}
補充:補碼程序:
/*
通過程序,可知一個數的補碼是多少。
*/
# include <stdio.h>
int main(void)
{
int i = 21; //正整數的補碼十六進制輸出正常
int j = -1; //負數的補碼十六進制輸出取反加1,0取反後全為1,所以左邊全為1,即全為F。
int k = -3;
int l = -100;
int s = 0XFFFFFFF5;
char ch = 129; //129默認為int類型,前面以0補齊,賦值給1個字節變量時,前面3個字節數據丟失。
printf("%#X\n", i);
printf("%#X\n", j);
printf("%#X\n", k);
printf("%#X\n", l);
printf("%d\n", s);
printf("%d\n", ch); //這就是輸出為-127的原因。
return 0;
}