枚举变量赋值问题

ayoung_go 2017-01-11 10:31:09
枚举变量在定义好之后,如果对这个变量赋值不是只能取已经定义好的值吗?比如说,我定义这样一个枚举变量
typedef enum {
FALSE = 0,
TRUE = 1,
}__attribute__((packed)) ptp_bool;

ptp_bool a[24];
那么a[0-23]不是只可以取值0或者1吗?但是我给赋值2或者3之类的合法值也是可以赋上的,不知道什么原因?
而且赋值为1的时候打印结果却不是1,qt下编译是16843009?
(ps:第二个问题值不对感觉很奇怪)


...全文
576 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
lunat 2017-01-11
  • 打赏
  • 举报
回复
因为你加了__attribute__((packed)),导致sizeof(ptp_bool)是1。
paschen 2017-01-11
  • 打赏
  • 举报
回复
引用 4 楼 laoqiuge 的回复:
援引二楼,不错我用了memset(a,1,64*sizeof(ptp_bool));但是a只占用一个字节,我怎么会同时对四个字节赋值呢?
你的TRUE与FALSE类型是int,如果要char,要写成:enum xxx : char 另参看: http://en.cppreference.com/w/cpp/language/enum
赵4老师 2017-01-11
  • 打赏
  • 举报
回复
printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方,而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。
ayoung_go 2017-01-11
  • 打赏
  • 举报
回复
我知道了是我用输出类型%d的原因
fefe82 2017-01-11
  • 打赏
  • 举报
回复
引用 4 楼 laoqiuge 的回复:
援引二楼,不错我用了memset(a,1,64*sizeof(ptp_bool));但是a只占用一个字节,我怎么会同时对四个字节赋值呢?
你得把 sizeof(ptp_bool) 打出来看看。 还有,你得去重新看看 memset 的文档。
fefe82 2017-01-11
  • 打赏
  • 举报
回复
引用 1 楼 jianwen0529 的回复:
bool 当 0 表示false,非0值为 true 大多数编译器false转int为0,true 为 1(不一定,可以自行决定具体的表现)
C 没有 bool ,之后 _Bool (从哪个版本加上的记不得了,C11 已经有了),用来保存两个值,0 和 1 。 stdbool.h 里定义了 #define bool _Bool #define true 1 #define false 0
ayoung_go 2017-01-11
  • 打赏
  • 举报
回复
printf的时候用了%d,应该没有正确对应enum的输出类型
ayoung_go 2017-01-11
  • 打赏
  • 举报
回复
援引二楼,不错我用了memset(a,1,64*sizeof(ptp_bool));但是a只占用一个字节,我怎么会同时对四个字节赋值呢?
fefe82 2017-01-11
  • 打赏
  • 举报
回复
引用 楼主 laoqiuge 的回复:
枚举变量在定义好之后,如果对这个变量赋值不是只能取已经定义好的值吗?比如说,我定义这样一个枚举变量 typedef enum { FALSE = 0, TRUE = 1, }__attribute__((packed)) ptp_bool; ptp_bool a[24]; 那么a[0-23]不是只可以取值0或者1吗?但是我给赋值2或者3之类的合法值也是可以赋上的,不知道什么原因? 而且赋值为1的时候打印结果却不是1,qt下编译是16843009? (ps:第二个问题值不对感觉很奇怪)
1. C 标准下 enum type 大小至少是一个 sizeof(char) 。在用非 enum constant 给 enum 变量赋值的时候,标准允许给 warning , 但是这不是一个强制要求。 2. 不知道你是怎么输出的。 比如:printf 输出的时候,%d 一类格式控制符需求的类型与给出的类型不一致的时候,是一个 UB (可能得到任何结果)。 printf 没有用于输出 enum 的格式控制符,所以必须手工转换。
小灸舞 版主 2017-01-11
  • 打赏
  • 举报
回复
16843009,即0x01010101,你是不是用什么函数给变量赋值了,比如memset(a, 1, sizeof(a));
幻夢之葉 2017-01-11
  • 打赏
  • 举报
回复
bool 当 0 表示false,非0值为 true 大多数编译器false转int为0,true 为 1(不一定,可以自行决定具体的表现)

70,014

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧