Roc*_*mir 0 c enums if-statement
我正在ansi C开发一个程序,我有一些问题.我有一个enum沿线
enum day
{
Monday = 'M',
Tuesday = 'T',
Wednesday = 'W'
}
Run Code Online (Sandbox Code Playgroud)
和2d array中days
typedef enum day availDays[numOfWeeks][daysOfWeek];
memset(theArray, Monday, sizeof(theArray));
Run Code Online (Sandbox Code Playgroud)
后来在if语句中使用,如下所示:
if ( theArray[0][0] == Monday )
{ foo statements; }
Run Code Online (Sandbox Code Playgroud)
但是这个条件永远不会评估,true即使数组的每个元素都是Monday,任何想法为什么呢?
这不起作用的原因是sizeof(enum day) != 1.所以你不能使用memset.
这是因为虽然您将每个枚举值设置为a char,但枚举的基础类型不是char.它(很可能)int.
这就是为什么memset不起作用的原因.它将元素的每个字节设置为"M".因此,每个元素将是值'M'的4个字节的"串联".
假设小端,ASCII字符编码('M'是0x4D)sizeof(int) 4,并且数组在memmory中应该如下所示:
0x4D0000004D000000...
Run Code Online (Sandbox Code Playgroud)
memset 设置为:
0x4D4D4D4D...
Run Code Online (Sandbox Code Playgroud)
唯一的解决方案是遍历数组并单独设置每个元素
for (i...)
for (j...)
theArray[i][j] = Monday;
Run Code Online (Sandbox Code Playgroud)
故事的道德:memset仅用于char缓冲.char是标准规定的唯一具有正确尺寸1的类型.
虽然问题是关于C,但是知道谁需要这个,这是很好的C++,因为C++11你可以指定一个基础类型enum:
enum Day : char {
...
};
sizeof(Day) == 1; // true
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
249 次 |
| 最近记录: |