这个C代码如何返回枚举?

时间:2012-03-05 00:01:24

标签: c enums

我对以下if_even函数感到有点困惑。返回类型FLAGS如何?这看起来很奇怪 - 不是枚举只是像#define那样使用多个整数的列表吗?

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;

   }

我感谢任何提示或建议。

5 个答案:

答案 0 :(得分:2)

ODDEVEN是枚举flag_o_e的成员,它们是typedeffed,因此可以将其命名为FLAGS。因此,从函数返回会返回该枚举的成员(枚举可以被认为是带有名称的受限整数类型)。

我认为您的问题是您不知道定义枚举本质上是定义一个可用作函数输入或输出的新类型。

答案 1 :(得分:2)

实际上,枚举是一种新类型。它不仅仅是int的一些别名。 (不过,它可以转换为int和。)

答案 2 :(得分:1)

C中的枚举有明确的定义。枚举的基础值映射到整数,并且可以与整数互换使用。您可以像使用结构

一样声明枚举和typedef枚举

http://en.wikipedia.org/wiki/Enumerated_type#C_and_syntactically_similar_languages

答案 3 :(得分:1)

返回类型FLAGS与枚举数据类型相关联。现在枚举显示EVEN = 1且ODD = 2.这些是位标志。使用'int'返回类型对此程序也同样有效。如果你想使用不同类型的枚举,如hex,oct等,使用FLAGS会更多。考虑枚举的好方法是有序值,并且能够将它绑定到一个单词中。这些适用于地图,整数......基本上任何需要以某种方式与数字相关联的东西。

答案 4 :(得分:1)

是的,声明在最顶层enum flag_o_e {EVEN, ODD};声明的枚举与执行

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

然后还有一个使用FLAGS代替flag_o_e的typedef,所以它本质上是:

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

因此,当if_even()执行return EVEN;时,它实际返回一个int,同样结果if (test2 == EVEN)的比较是将结果(实际上是一个int)与EVEN进行比较,这也是一个中间体

typedef可能会让人感到有些困惑,但它只是一种将类型(例如int或'struct foo')重命名为更具可读性和上下文的技术。