
2.9 典型例题分析
【例2-11】下面4个选项中,均是合法整型常量的选项是( )。
A.120 B.-0xadf C.-01 D.-0x48a
0xABCD 01a 98.012 2e5
011 0xe 0668 0x
解析:
由定义可知:
十进制整型常量:以非0数字打头的十进制数字串,如120、-450。
八进制整型常量:以数字0打头的八进制数字串,如04、0102。
十六进制整型常量:以数字和字母的组合0x或0X打头的十六进制数字串,如0x7AF2。
所以答案为A。
【例2-12】下面4个选项中,均是不合法的变量名的选项是( )。
A.apple B.-apple C._apple D.apple0
std st%d s_td std1
lint int _int int2
解析:
根据变量命名要求:
1)变量名以英文字母或下划线开头。
2)变量名只能由大小写字母、数字、下划线组成。
3)C语言的关键字不能作为变量名。
因此答案为B。
【例2-13】若有以下类型说明语句:
char a;
int b;
float c;
double d;
则表达式a*b+d-c的结果类型为( )。
A.float B.char C.int D.double
解析:
本题是不同类型数据进行算术混合运算。对于双目运算符,其两侧的操作数的类型必须一致。若运算符两侧的操作数的类型不一致,则系统将自动按照转换规则先对操作数作类型转换再进行相应的运算。其结果类型的转换规律如表2-3所示。
表2-3 转换规律型
所以:
a*b的结果类型为int类型
a*b+d的结果类型为double类型
a*b+d-c的结果类型为double类型
因此答案为D。
【例2-14】若有定义:int a=7;
floax=2.5,y=4.7;
则表达式x+a%3*(int)(x+y)%2/4的值是( )。
A.2.500000 B.2.750000 C.3.500000 D.0.000000
解析:
各个算术运算符的优先级按由高到低的顺序排列为:先括号内后括号外,单目运算符“+”与“-”,双目运算符“*”“/”“%”以及双目运算符“+”与“-”。
运算符的结合性为:单目运算符“+”与“-”的结合方向为从右到左,而双目运算符“*”“/”“%”“+”“-”的结合方向为从左到右。
由于“%”不能用于float类型,7.2%2是非法表达式。所以本例中使用了强制类型转换,将float类型强制转换成int类型后再进行计算。根据运算符的优先级由高到低以及运算符的结合性进行运算:
由于x为float类型数据,float类型数据的有效位是7位,所以结果为2.500000。
因此答案为A。
【例2-15】写出以下程序的运行结果。
解析:
本题主要理解算术单目运算符(++、--)的使用方法。语句x=m++;表示将m的值先赋给x后,然后m加1。而语句x=++m;表示m先加1后,再将新值赋给x。
在程序中,语句n=-m++;中m左边的“-”号是负号运算符,右边的“++”是自加运算符。负号运算符和自加运算符优先级相同,但结合方向为自右至左。因此该语句相当于两个语句n=-m;m=m+1;即先赋值后自增。因而n的值为-2,m的值为3。
程序运行的结果为:
m=3 n=-2
【例2-16】用sizeof()测试各种数据类型的长度。
解析:
sizeof()是测试数据长度运算符,用来测试各种数据类型的数据在内存中所占的字节数。在VC++6.0中运行该程序的结果:
注意:
在Turbo C集成环境中,int型数据在内存中占2个字节,而在VC++6.0集成环境中int型数据在内存中占4个字节。
【例2-17】编程输出int型数据的高、低位字节。
解析:
C语言中十六进制整型常量是以数字和字母的组合0x打头的十六进制数字串。程序第5行将一个十六进制数赋给整型变量a。由a=0xf234可知,a的高字节是0xf2,低字节是0x34。
程序第7行将a右移8位,根据算术右移规则,a>>8的值是0xfff2,而0xfff2&0x00ff的值是0x00f2(即十进制数242)。
第8行a&0x00ff将直接获得a的低字节0x34,因此,lb的值是0x0034(即十进制数52)。
程序的运行结果:
high byte of a is 242
low byte of a is 52