c语言枚举用法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言枚举用法相关的知识,希望对你有一定的参考价值。
enum string
x1,
x2,
x3=10,
x4,
x5,
x;
问x= 0x801005,0x8010f4 ;
以上是一个面试题目。但是我看不懂,不晓得问什么,也不知道该怎么答。
能否详细讲解一下,x=0x801005,怎么来的,还有就是后面那个0x8010f4怎么来的?这个题目到底想问什么,怎么回答?
一、对枚举型的变量赋值。
实例将枚举类型的赋值与基本数据类型的赋值进行了对比:
方法1:先声明变量,再对变量赋值
#include<stdio.h>/* 定义枚举类型 */
enum DAY MON=1, TUE, WED, THU, FRI, SAT, SUN ;
void main()
/* 使用基本数据类型声明变量,然后对变量赋值 */
int x, y, z;
x = 10;
y = 20;
z = 30;
/* 使用枚举类型声明变量,再对枚举型变量赋值 */
enum DAY yesterday, today, tomorrow;
yesterday = MON;
today = TUE;
tomorrow = WED;
printf("%d %d %d \\n", yesterday, today, tomorrow);
方法2:声明变量的同时赋初值
/* 定义枚举类型 */
enum DAY MON=1, TUE, WED, THU, FRI, SAT, SUN ;
void main()
/* 使用基本数据类型声明变量同时对变量赋初值 */
int x=10, y=20, z=30;
/* 使用枚举类型声明变量同时对枚举型变量赋初值 */
enum DAY yesterday = MON,
today = TUE,
tomorrow = WED;
printf("%d %d %d \\n", yesterday, today, tomorrow);
方法3:定义类型的同时声明变量,然后对变量赋值。
#include <stdio.h>/* 定义枚举类型,同时声明该类型的三个变量,它们都为全局变量 */
enum DAY MON=1, TUE, WED, THU, FRI, SAT, SUN yesterday, today, tomorrow;
/* 定义三个具有基本数据类型的变量,它们都为全局变量 */
int x, y, z;
void main()
/* 对基本数据类型的变量赋值 */
x = 10; y = 20; z = 30;
/* 对枚举型的变量赋值 */
yesterday = MON;
today = TUE;
tomorrow = WED;
printf("%d %d %d \\n", x, y, z); //输出:10 20 30
printf("%d %d %d \\n", yesterday, today, tomorrow); //输出:1 2 3
方法4:类型定义,变量声明,赋初值同时进行。
#include <stdio.h>/* 定义枚举类型,同时声明该类型的三个变量,并赋初值。它们都为全局变量 */
enum DAY
MON=1,
TUE,
WED,
THU,
FRI,
SAT,
SUN
yesterday = MON, today = TUE, tomorrow = WED;
/* 定义三个具有基本数据类型的变量,并赋初值。它们都为全局变量 */
int x = 10, y = 20, z = 30;
void main()
printf("%d %d %d \\n", x, y, z); //输出:10 20 30
printf("%d %d %d \\n", yesterday, today, tomorrow); //输出:1 2 3
2、对枚举型的变量赋整数值时,需要进行类型转换。
#include <stdio.h>enum DAY MON=1, TUE, WED, THU, FRI, SAT, SUN ;
void main()
enum DAY yesterday, today, tomorrow;
yesterday = TUE;
today = (enum DAY) (yesterday + 1); //类型转换
tomorrow = (enum DAY) 30; //类型转换
//tomorrow = 3; //错误
printf("%d %d %d \\n", yesterday, today, tomorrow); //输出:2 3 30
3、使用枚举型变量
#include<stdio.h>enum
BELL = \'\\a\',
BACKSPACE = \'\\b\',
HTAB = \'\\t\',
RETURN = \'\\r\',
NEWLINE = \'\\n\',
VTAB = \'\\v\',
SPACE = \' \'
;
enum BOOLEAN FALSE = 0, TRUE match_flag;
void main()
int index = 0;
int count_of_letter = 0;
int count_of_space = 0;
char str[] = "I\'m Ely efod";
match_flag = FALSE;
for(; str[index] != \'\\0\'; index++)
if( SPACE != str[index] )
count_of_letter++;
else
match_flag = (enum BOOLEAN) 1;
count_of_space++;
printf("%s %d times %c", match_flag ? "match" : "not match", count_of_space, NEWLINE);
printf("count of letters: %d %c%c", count_of_letter, NEWLINE, RETURN);
参考技术A 应该是x的范围吧?确实是面试题 我也遇到了 参考技术B 问题确实没说清楚 x应该是内存地址吧 十六进制的追问
对呀,题目有些慕名奇妙啊~
追答x1=0
x2=1
x3=10
x4=11
x5=12
x=0x801005 是因为x是一个枚举的变量,而你没有初始化x
在使用x之前最好初始一下,如:x=x1;
直接百度到的
我也没明白,这个题目难道是想问 x能够取什么地址?那又怎么知道这地址是0x80100**开始的呢?
追答那他应该是考察你int值能不能直接转为enum值吧,不然即使是将指针地址进行赋值,那也肯定会报错的,因为你根本不知道0x801005指向哪里。
追问(⊙o⊙)…不知题目所云~
追答以后遇到这种面试题时,不太清楚题目的意思时,可以多问问面试官,没多大关系的。。。
本回答被提问者采纳c语言,有没有办法遍历枚举类型
在C语言中,枚举类型是被当做int或者unsigned int类型来处理的,所以按照C语言规范是没有办法遍历枚举类型的。不过在一些特殊的情况下,可以实现有条件的遍历。
1 枚举类型必须连续。
由于枚举类型支持如下方式定义:
enum
ENUM_0,
ENUM_10 = 10,
ENUM_11
;
这样就会导致枚举类型不连续,这种枚举无法遍历。
2 枚举类型中人为加入起始及结束标记。
enum
ENUM_START,
ENUM_0,
ENUM_1,
ENUM_2,
ENUM_END
;
可以看到,在这个枚举类型中,人为加入可ENUM_START, 和ENUM_END。中间的ENUM_0,ENUM_1,ENUM_2才是实际的有效数据。当后续需要增删枚举元素时,也要保证ENUM_START, 和ENUM_END分别为最小和最大值。
满足以上两种条件下,就可以做枚举的遍历了,参考代码如下:
int i;
for(i = ENUM_START+1; i<ENUM_END; i ++)
//使用枚举元素。
这个循环中,i的值就是所有有效的枚举元素值。 参考技术A 就是你声明的这个枚举变量的值,只能取其中的东西,比如:enum Monday,Tuesday,Wednesday,Thursday,Friday weekday;那weekday这个变脸的值只能是中的值。(他们分别对应数字0,1,2,3,4,因为枚举型变量也是整型)追问
枚举类型的元素,不一定是从0开始,+1递增的。
比如,
typedef enum
A,
B,
C = 6,
D,
E,
F,
G,
H
alpha_enum;
enum liquid
OUNCE = 1,
CUP = 8,
PINT = 16,
QUART = 32,
GALLON = 128
;
如何用一个通用的方法来遍历。
以上是关于c语言枚举用法的主要内容,如果未能解决你的问题,请参考以下文章