繁体   English   中英

C中if语句中的枚举比较

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM