枚举型本质是整型,只是以字符串的形式组成便于理解。
我们可以认为 enum Op=int=Opr,
而枚举成员可以认为是int型的变量,
例如typedef enum Op{ADD,SUB,MUL,DIV,MOD,MAX} Opr;
可以等价为 int ADD=0,SUB=1,MUL=2,DIV=3,MOD=4,MAX=5。
#include<stdio.h>
typedef enum Op{ADD,SUB,MUL,DIV,MOD,MAX} Opr;
int compu(int x,int y,enum Op op){
if(op==ADD) return x+y;
if(op==SUB) return x-y;
if(op==MUL) return x*y;
if(op==DIV) return x/y;
if(op==MOD) return x%y;
if(op==MAX) return x>y?x:y;
printf("Illegal operator.\n");
return 0;
}
int main(){
enum Op opr=MUL;
printf("%d\n",compu(2,5,opr));
printf("%d\n",compu(3,6,MOD));
printf("%d\n",compu(6,7,19));
printf("%d\n",compu(-5,7,5));
Opr opr1=SUB;
printf("%d\n",compu(4,3,opr1));
opr1=3;
printf("%d\n",compu(8,3,opr1));
}
对应汇编代码如下:
.LC0:
.string "Illegal operator."
compu:
push rbp
mov rbp, rsp
sub rsp, 16
mov DWORD PTR [rbp-4], edi
mov DWORD PTR [rbp-8], esi
mov DWORD PTR [rbp-12], edx
cmp DWORD PTR [rbp-12], 0
jne .L2
mov edx, DWORD PTR [rbp-4]
mov eax, DWORD PTR [rbp-8]
add eax, edx
jmp .L3
.L2:
cmp DWORD PTR [rbp-12], 1
jne .L4
mov eax, DWORD PTR [rbp-4]
sub eax, DWORD PTR [rbp-8]
jmp .L3
.L4:
cmp DWORD PTR [rbp-12], 2
jne .L5
mov eax, DWORD PTR [rbp-4]
imul eax, DWORD PTR [rbp-8]
jmp .L3
.L5:
cmp DWORD PTR [rbp-12], 3
jne .L6
mov eax, DWORD PTR [rbp-4]
cdq
idiv DWORD PTR [rbp-8]
jmp .L3
.L6:
cmp DWORD PTR [rbp-12], 4
jne .L7
mov eax, DWORD PTR [rbp-4]
cdq
idiv DWORD PTR [rbp-8]
mov eax, edx
jmp .L3
.L7:
cmp DWORD PTR [rbp-12], 5
jne .L8
mov edx, DWORD PTR [rbp-8]
mov eax, DWORD PTR [rbp-4]
cmp edx, eax
cmovge eax, edx
jmp .L3
.L8:
mov edi, OFFSET FLAT:.LC0
call puts
mov eax, 0
.L3:
leave
ret
.LC1:
.string "%d\n"
main:
push rbp
mov rbp, rsp
sub rsp, 16
mov DWORD PTR [rbp-4], 2
mov eax, DWORD PTR [rbp-4]
mov edx, eax
mov esi, 5
mov edi, 2
call compu
mov esi, eax
mov edi, OFFSET FLAT:.LC1
mov eax, 0
call printf
mov edx, 4
mov esi, 6
mov edi, 3
call compu
mov esi, eax
mov edi, OFFSET FLAT:.LC1
mov eax, 0
call printf
mov edx, 19
mov esi, 7
mov edi, 6
call compu
mov esi, eax
mov edi, OFFSET FLAT:.LC1
mov eax, 0
call printf
mov edx, 5
mov esi, 7
mov edi, -5
call compu
mov esi, eax
mov edi, OFFSET FLAT:.LC1
mov eax, 0
call printf
mov DWORD PTR [rbp-8], 1
mov eax, DWORD PTR [rbp-8]
mov edx, eax
mov esi, 3
mov edi, 4
call compu
mov esi, eax
mov edi, OFFSET FLAT:.LC1
mov eax, 0
call printf
mov DWORD PTR [rbp-8], 3
mov eax, DWORD PTR [rbp-8]
mov edx, eax
mov esi, 3
mov edi, 8
call compu
mov esi, eax
mov edi, OFFSET FLAT:.LC1
mov eax, 0
call printf
mov eax, 0
leave
ret
可以看出枚举型变量最终都被编译成了数字,也就是整型。