2012年8月30日星期四

enum的小问题

这个博客上看到这样一个问题:

//问题1
//foo函数输出什么?
enum MY_ENUM{
  MY_OK = 0,
  MY_NOT_OK,
}

void foo()
{
   int i = -1;
   enum My_ENUM my_enum = MY_OK;

   if( i < my_enum) printf("I am OK!\n");
   else printf("I am NOT OK!\n");

}

如果对上面的函数做小小的修改,又是什么结果?

//问题2
//foo函数输出什么?
enum MY_ENUM{
  MY_OK = 0,
  MY_NOT_OK,
}

void foo()
{
   int i = -1;
   enum My_ENUM my_enum = MY_OK;

   if( i < MY_OK) printf("I am OK!\n");
   else printf("I am NOT OK!\n");

}
FOR THE MARGIN. HAVE BETTER MATHOD?

文中给出的答案是问题1输出"I am NOT OK!",而问题2输出"I am OK!".多多少少让我有点琢 磨不透,为什么会这样呢?

实际上,正如文中提到的,gcc确实是这样的结果。但如果同样的程序在msvc去运行,就会发 现问题1和问题2都是输出"I am OK!". 这是跟编译器实现有关的问题。在gcc中,当enum常数 (所谓的enum常数就是enum类型中标记的那些值,如程序中的MY_OK)没有负数时,gcc将 enum类型变量(注意与enum常数的区别,如程序中的my_enum)存储为无符号int。当enum常 数有负数时,则仍然乖乖地存储为int。而enum常数是一直都存储为int。msvc则是不管什么 情况,都将enum常数和enum类型存储为int。在这个实现上,我觉得gcc真是吃饱了撑的,你 觉得呢?

综上所述,这是个不好的问题。姑且一笑而过。

没有评论:

发表评论