gpt4 book ai didi

c - if语句中的枚举比较在c中永远不会为真

转载 作者:太空宇宙 更新时间:2023-11-04 05:53:01 24 4
gpt4 key购买 nike

我正在用 ansi C 开发一个程序,但遇到了一些问题。我有一个 enum

enum day
{
Monday = 'M',
Tuesday = 'T',
Wednesday = 'W'
}

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,数组应该看起来像这在内存中:

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

关于c - if语句中的枚举比较在c中永远不会为真,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34690917/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com