2012-03-05 44 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 ...基本上任何需要以某种方式绑定到一个数字。

相关问题