|
|
检测点10-12
1.若g是一个int类型的对象,表达式g << 3将对象g本身的内容左移3位,对吗?
答:错误。
2.表达式15 & 5的值是 5 ;表达式15 | 5的值是 15 。
3.给定以下代码:
double fc (int a, unsigned int b, float c, double d)
{
return a + b * c - d;
}
问:在表达式a + b * c - d中,运算顺序是怎样的?每个操作数的类型是如何转换的?
答:加性运算符是从左向右结合的,所以此表达式等价于 (a + b * c) - d。
先得到运算符*的结果,且需要常规算术转换,将b的值转换为float类型。
表达式 b * c 的结果类型是float。
接着得到运算符 + 的结果,且需要常规算术转换,将a的值转换为float类型。
表达式a + b * c的结果类型是float。
最后得到运算符 - 的结果,且需要常规算术转换,将表达式 a + b * c 的值转换为double类型。
表达式 a + b * c - d 的结果类型是double。
4.给定以下代码:
unsigned int u = 10;
int s = -5;
if (s < u) {
printf("s < u\n");
} else {
printf("s >= u\n");
}
这段代码打印什么?为什么?
答:打印 s >= u
运算符<的两个操作数执行常规算术转换后类型不变,都还是原来的类型。按照规定,提升后,如果两个操作数的类型相同,则不再进行转换,否则,如果两个操作数的类型不同,一个是有符号整数类型,另一个是无符号整数类型,那么,如果无符号整数类型的阶高于或者等于有符号整数类型,则有符号整数类型的操作数转换为另一个操作数的类型。
据此,要将s的值从int类型转换为unsigned int类型。转换后是一个很大的正数(在我的计算机上是4294967295 + 1 - 5 = 4294967291),远大于u的值,所以执行else子句。
|
|