簡體   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