[英]enum comparison in if statement never true in c
我正在用ansi C开发程序,但遇到了一些问题。 我有一个enum
enum day
{
Monday = 'M',
Tuesday = 'T',
Wednesday = 'W'
}
和2d array
days
2d array
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
,则该数组在内存中应如下所示:
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.