if语句中的枚举比较在c中永远不是真的
我正在ansi C开发一个程序,我有一些问题。 我有一个enum
enum day { Monday = 'M', Tuesday = 'T', Wednesday = 'W' }
和days
2d array
days
typedef enum day availDays[numOfWeeks][daysOfWeek]; memset(theArray, Monday, sizeof(theArray));
后来在if语句中使用,如下所示:
if ( theArray[0][0] == Monday ) { foo statements; }
但即使数组的每个元素都是Monday
,这个条件永远不会计算为true
,任何想法为什么?
这不起作用的原因是sizeof(enum day) != 1
。 所以你不能使用memset
。
发生这种情况是因为虽然您将每个枚举值设置为char
,但枚举的基础类型不是char
。 它(很可能)是int
。
这就是memset
不起作用的原因。 它将元素的每个字节设置为“M”。 因此,每个元素将是值’M’的4个字节的“串联”。
假设小端,ASCII字符编码( 'M'
是0x4D
)和sizeof(int) 4
,数组应该在memmory中如下所示:
0x4D0000004D000000...
memset
将其设置为:
0x4D4D4D4D...
唯一的解决方案是循环遍历数组并单独设置每个元素
for (i...) for (j...) theArray[i][j] = Monday;
故事的道德:仅将memset
用于char
缓冲区。 char
是标准规定的唯一具有正确大小1的类型。
虽然问题是关于C
,但是知道C++
需要这个的人是很好的,因为从C++11
你可以指定enum
的基础类型:
enum Day : char { ... }; sizeof(Day) == 1; // true