/*
整形提升的关键:
* 1.一个char类型、short类型、位域(不论是有符号还是无符号)或是一个枚举体,都可以在int或是unsigned int可以使用的表达式中使用。
* 2. 换句话就是上述的类型可以替换表达式中的int或是unsigned int
*/
#include "../common.h"
int add(int addA,int addB)
{
return addA + addB;
}
/*无法限定作用域,可能会导致冲突*/
enum Test
{
e_a,
e_b,
e_c,
};
class CTest
{
private:
public:
enum _enum
{
eC_a,
eC_b,
eC_c,
};
};
/*
C++11 枚举类
*/
enum class test
{
ec_a,
ec_b,
ec_c,
};
/* 枚举类定义基础类型*/
enum class test2:int
{
ec_a,
ec_b,
ec_c,
};
enum class test3:char
{
ec_a,
ec_b,
ec_c,
};
int main()
{
char c_a = 1,c_b = 1;
/*整形提升*/
printf("c_add:%d\n",add(c_a,c_b)); // 2 = 1 + 1
/*普通枚举,可整形提升,可随意访问*/
printf("e_add:%d(e_a,e_c)\n",add(e_a,e_c)); // 2 = 0 + 2
/*类里面定义枚举,无法直接访问,可以整形提升*/
//printf("eC_a:%d\n",eC_a);
printf("eC_a:%d eC_add\n",add(CTest::_enum::eC_a,CTest::_enum::eC_b));//编译没有警告
/*C++11枚举类,无法直接访问,不能整形提升*/
//printf("ec_add:%d\n",add(ec_a,ec_c)); //编译报错,无法直接访问ec_a,ec_c
printf("%d\n",test::ec_b); //编译会有警告,因为%d类型是test而非int
//printf("ec_add:%d\n",add(test::ec_a,test::ec_c)); //编译报错,无法当作int使用
test2 t_a;
test3 t_b;
printf("%d\n",test2::ec_b); //
printf("size2:%lu size3:%lu\n",sizeof(t_a),sizeof(t_b));
printf("ec_add:%d\n",add((int)test2::ec_a,(int)test2::ec_c)); //强转为int
t_a = test2::ec_a;
/*if(t_a == 1) //会报错
{
}*/
Test e_ta;
if(e_ta == 0)//会成功,所以用普通的枚举会有一定危险
{
printf("It's true...\n");
}
}