2012-03-05 68 views
1

我對以下if_even函數有點困惑。返回類型標誌如何?這看起來很奇怪 - 不是一個枚舉只是一個多個整數的列表,如#define的使用嗎?這個C代碼如何返回一個枚舉?

enum flag_o_e {EVEN, ODD}; 
enum flag_o_e test1; 
typedef enum flag_o_e FLAGS; 

FLAGS if_even(int n); 

main() 
{ 
    int x; 
    FLAGS test2; 

    printf("input an integer: "); scanf("%d", &x); 
    test2 = if_even(x); 
    if (test2 == EVEN) 
    printf("test succeeded (%d is even)\n", x); 
    else 
    printf("test failed (%d is odd)\n", x);system("pause"); 
} 

FLAGS if_even(int n) 
{ 
    if (n%2) 
    return ODD; 
    else 
    return EVEN; 

    } 

我欣賞任何提示或建議。

回答

1

是在最頂部enum flag_o_e {EVEN, ODD};宣佈聲明的枚舉是一樣的因爲這樣做

#define EVEN 0 
#define ODD 1 
typedef int flag_o_e; 

然後有一個進一步的typedef到位flag_o_e的使用FLAGS所以它的本質:

#define EVEN 0 
#define ODD 1 
typedef int FLAGS; 

因此,當if_even()執行return EVEN;它實際上返回一個int,並且結果if (test2 == EVEN)的比較結果是比較結果(這實際上是一個int)與EVEN,這也是一個int。

typedef可能會有點混亂,但它只是一種將類型(如int或'struct foo')重命名爲更具可讀性和上下文相關性的技術。

+0

雖然正如其他答案所指出的那樣,枚舉是一個不同的類型,而不僅僅是一堆#define FOO n的別名,所以也許我的答案更令人困惑; D – aidanok 2012-03-05 00:29:22

2

ODDEVEN是enum flag_o_e的成員,它是typedeffed,因此可以稱爲FLAGS。因此,從函數返回返回該枚舉的成員(枚舉可以被認爲是具有名稱的受限整數類型)。

我認爲你的問題是,你不知道定義一個枚舉本質上是定義一個新的類型,可以用作函數的輸入或輸出。

2

實際上,枚舉是一種新類型。它不僅僅是int的一個別名。 (雖然它可以轉換爲int,但是可以將其轉換爲int)。

1

與枚舉數據類型的返回類型標記的關係可以聲明枚舉和類型定義枚舉。現在,枚舉顯示EVEN = 1和ODD = 2。這些是位標誌。使用'int'返回類型也適用於此程序。如果你想使用不同類型的枚舉,例如十六進制,十六進制等,使用FLAGS會更好。想想枚舉的一個好方法是有序值,並且可以將它們組合成一個單詞。這些與地圖,ints ...基本上任何需要以某種方式綁定到一個數字。