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