台湾某著名CPU生产公司2005年招聘中有一个面试题为:下面程序的结果是什么?
char foo(void)
{
unsigned int a=6;
int b=-20;
char c;
(a+b>6)?(c=1):(c=0);
return c;
}
------------------------------------------------------
解析:结果为1。这是因为无符号数(unsigned int)和有符号数(int)相加,系统会自动把有符号数转化为无符号数类型(unsigned int)。因此题中的a+b的值不是-14,而是一个unsigned int类型的数:4294967382(0xfffffff2)。因此返回值c为1。
C++定义了一组内置类型对象之间的标准转换,在必要时编译器可以隐式地应用到对象上。隐式类型转换发生在下列典型情况下:
1、在混合类型的算术表达式中:这种情况下最宽的数据类型成为目标转换类型(即算术转换)。
如:int ival=3;
double dval=3.14159;
若有ival+dval则ival会被自动转化为double类型的3.0。
2、用一种类型的表达式赋给另一种类型的对象:在这种情况下目标转化类型是被赋值对象的类型。
如:int *pi=0 ;//int类型的文字常量0将被自动转化为int *型的指针表示空地址。
ival=dval ;//double类型的dval将被自动转化为int型的值。
3、把一个表达式传递给一个函数,调用表达式的类型与形式参数的类型不相同:这种情况下目标转换类型是形式参数的类型。(实际上还是属于上述第2中情况下的应用)
如:extern double sqrt(double) ;
cout<<"The square root of 2 is "<<sqrt(2)<<endl; //实参2将被转化为double型的2.0.
4、从一个函数返回一个表达式的类型与返回类型不相同:在这种情况下返回的表达式类型自动转换为函数类型。
如:
double difference(int ival1,int ival2)
{
return ival1-ival2; //返回值被自动转化为double类型
}
------------------------------------------------------
算术转换的两个指导原则为:
1、为防止精度丢失,如果有必要的话类型总是被提升为较宽的类型;
2、所有含有小于整型的有序类型的算术表达式在计算之前其类型都会被转换成整型。
参考资料:《程序员面试宝典》