在这个博客上看到这样一个问题:
//问题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"); }
文中给出的答案是问题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真是吃饱了撑的,你 觉得呢?
综上所述,这是个不好的问题。姑且一笑而过。
没有评论:
发表评论