第2章 运算符与表达式
1、表达式:(int)((double)9/2)- 9%2 的值是 A) 0B) 3C) 4D) 5 参考答案:B 【解析】先将整型数据9强制转换成double型,然后除以2得到的结果与double型保持一致,即为4.5,然后将4.5强制转换成整型数据4,然后计算9%2的值为1,最后计算4-1的值为3,所以选择B选项?
2、sizeof( double )是 A) 一个整型表达式 B) 一个双精度型表达式 C) 一个不合法的表达式 D) 一种函数调用 参考答案:A
【解析】sizeof是C语言中的一个操作符(operator),不是函数调用,简单的说其作用就是返回一个对象或者类型所占的内存字节数?所以选择A?
3、若有定义int x,y;并已正确给变量赋值,则以下选项中与表达式(x-y)?(x++) : (y++)中的条件表达式(x-y) 等价的是( )。 A) (x-y<0||x-y>0) B) (x-y<0) C) (x-y>0) D) (x-y==0) 参考答案:A
【解析】条件表达式:x=表达式1?表达式2:表达式3 的含义是:先求解表达式1,若为非0(真),则求解表达式2,将表达式2的值赋给x。若表达式1的值为0(假),则求解表达式3,将表达式3的值赋给x。在本题中与表达式1:(x-y)等价的是(x-y<0||x-y>0)。
4、若变量已正确定义,在if (W) printf(\,k );中,以下不可替代W的是( )。 A) a<>b+c B) ch=getchar() C) a==b+c D) a++ 参考答案:A
【解析】选项A)是非法的表达式,C语言中没有<>运算符。
5、以下选项中不属于C语言程序运算符的是 A) sizeof B) <> C) ( ) D) &&
参考答案:B
【解析】C语言中的不等于符号用\表示,没有符号\?所以选择B?
6、设有定义:int x=7,y=12;,则以下表达式值为3的是 A) (y%=x)-(x%=5) B) y%=(x%=5) C) y%=x-x%5 D) y%=(x-x%5) 参考答案:A
【解析】a%=b表示a=a%(b),故A选项可改写成y=y%x,x=x%5,再计算y-x计算的结果为3,满足题意,因此答案为A选项。
7、有以下程序
#include
{ int c, d; c = 10^3; d = 10+3;
printf(\ }
程序运行后的输出结果是 A) 103,13 B) 13,13 C) 10,13
D) 9,13 参考答案:D
【解析】c语言中\的意思是按位异或,因此10^3表示先把10和3换算成2进制再进行异或,因此答案为D选项。
8、有以下程序:
#include
{ int s,t,A=10; double B=6; s=sizeof(A); t=sizeof(B); printf(\,%d\\n\,s,t); }
在VC6.0平台上编译运行,程序运行后的输出结果是( )。 A) 10,6 B) 4,4 C) 2,4 D) 4,8
参考答案:D
【解析】C语言中利用sizeof()函数判断数据类型长度,在VC6.0平台中,整型int占有4个字节,double型数据占有8个字节。
9、若有定义语句:int x=10;,则表达式x-=x+x的值为( )。 A) 0 B) -20 C) -10 D) 10
参考答案:C
【解析】算术运算符+的优先级高于-=,且-=的结合方向为自右向左,所以表达式x-=x+x可以表示成x=x-(x+x)=10-(10+10)=-10,选择C)。
10、不能正确表示数学式A) a/c*b B) a*b/c C) a/ b* c D) a*(b/c) 参考答案:C ??·????
的表达式是
a*c【解析】/号和*号的优先级处于平级,结合性都是自左至右?所以选择C,C式子表示的是b?
11、有以下程序
#include
int sum, pad, pAd; sum = pad = 5;
pAd = ++sum, pAd++, ++pad; printf(\ }
程序的输出结果是 A) 5 B) 6 C) 7 D) 8
参考答案:B
【解析】C语言区分大小写,pad与pAd是两个不同的变量?首先将5赋值给两个变量,由于赋值运算符的优先级高于逗号运算符,所以计算pAd=++sum,此时pAd为6,sum也为6,然后计算pAd++,pAd的值变为7,++pad,pad的值变为6,所以选择B?
12、有以下程序
#include
{ int c,d;
c = 10 | 5; d = 10 + 5; printf(\}
程序的运行结果是 A) 15,15
B) 10,15 C) 5,15 D) 105,15 参考答案:A
【解析】由于按位或\优先级高于赋值\,10=1010B,5=0101B,按位或结果为1111B=15,故c=15,d=15,A选项正确。
13、有以下程序
#include
int a, b, c=241; a = c/100 % 9;
b = ( -1 )&&( -1 );
printf(\}
程序运行后的输出结果是 A) 2,1 B) 6,1 C) 6,0 D) 2,0
参考答案:A
【解析】程序执行过程为:c=241,c/100=2,2%9=2,得a=2;\优先级低于\,非0值为真,0值为假,即(-1)为真,逻辑与表达式(-1)&&(-1)为真,得b=1。A选项正确。
14、已知a=5,b=6,c=7,d=8,m=2,n=2,执行(m=a>b)&&(n=c 参考答案:C 【解析】\优先级低于\。\逻辑与表达式:exp1&&exp2,规则为:对exp1求值,若为0,则表达式为0,且不计算exp2;若exp1非0,则求exp2值,作为表达式值。本题计算过程为:先判断a>b为假,m=0,整个逻辑表达式为假,不计算右表达式,n=2。C选项正确。 15、有如下程序 #include int a = 8, b; b = (a >> 2) % 2; printf(\} 程序运行后的输出结果是 A) 8,0 B) 4,0 C) 4,1 D) 8,1 参考答案:A 【解析】\右移运算符,按位右移运算规则是将一个操作数先转换成二进制数,然后将二进制数各位右移若干位,移出的低位舍弃;并在高位补位,若为无符号数,右移时左边高位移入0。a=8=01000,执行a>>2后,a=00010=2,b=2%2=0,输出a,b为8,0,A选项正确。 16、若有C语言表达式 2+3*4+7/3,以下选项中叙述正确的执行顺序是 A) 先执行3*4得12,再执行7/3得2.5,最后执行2+12+2.5得16.5 B) 先执行3*4得12,再执行2+12得14,再执行7/3得2,最后执行14+2得16 C) 先执行7/3得2,再执行3*4得12,再执行12+2得14,最后执行2+14得16 D) 先执行2+3得5,再执行5*4得20,再执行20+7得27,最后执行27/3得9 参考答案:B 【解析】首先,在C语言中,乘除法优先级要高于加减法,其次,除法运算符\两边参加运算对象都是整数,运算结果要取整,故排除A,D选项;C语言中,因为运算符\和\都满足从左到右的运算规则,故应先计算3*4=12因此C排除,答案为B选项。 17、若想给已定义为int型的变量a、b、c、d赋整数1,以下选项中错误的语句是 A) d=c, c=b, b=a, a=1; B) d=c=b=a=1; C) d=(b=c=(a=1)); D) d=1, c=d, b=c, a=b; 参考答案:A 【解析】赋值是将一个常量的值赋给一个变量,在A选项中,c初始值未定义,相当于一个未知数给变量d赋值,不满足赋值为1的条件,答案选A;B选项中, d=c=b=a=1因为赋值运算符号具有右结合性质,故可理解为d=(b=c=(a=1))。 18、表达式 a+=a -= a=9 的值是 A) 18 B) -9 C) 0 D) 9 参考答案:C 【解析】首先计算a=9,然后计算a-=9,即a=a-9,结果为0,然后计算a+=0,即a=a+0,所以最终结果为0? 19、若变量已正确定义,以下选项中非法的表达式是 A) a!=4||'b' B) 'a'=1/2*(x=y=20,x*3) C) 'a' % 4 D) 'A' + 32 参考答案:B 【解析】A选项中'a'即表示a为字符常量,再给'a'赋值1/2*(x=y=20,x*3),是不正确的。因此B选项正确。 20、有以下程序 #include { int a; a = (int)(-1.53*3); printf(\} 程序的运行结果是 A) -4 B) -3 C) -5 D) 结果不确定 参考答案:A 【解析】-1.53*3=-4.59,执行语句a=(int)(-1.53*3);强制将浮点数-4.59转换成整型为-4,则a=-4,A选项正确。 21、有以下程序 #include { int a; a = (int)1.99*3; printf(\} 程序的运行结果是 A) 3 B) 5 C) 6 D) 结果不确定 参考答案:A 【解析】浮点数1.99被强制转换成1,执行语句a=(int)1.99*3;计算得a=1*3=3,A选项正确。 22、有以下程序 #include x = a - (int)a; return x; } main( ) { double a = 3.1415; printf(\} 程序的运行结果是 A) 3.000000 B) 3.141500 C) 0.141500 D) 0.000000 参考答案:B 【解析】这里考查了强制转换的概念,在fun函数中,x=a-(int)a表示x取值为a的小数部分,因此,输入a为3.1415,输出x=0.141500,答案为C选项。 23、有以下程序 #include int sub(double a, double b) { return (int)(a - b - 1.3); } main( ) { printf(\} 程序运行后的输出结果是 A) -2 B) 1.7 C) -3 D) 2.0 参考答案:A 【解析】sub函数输出(int)(a - b - 1.3)将结果强制转化为整型,因此可以排除B、D选项,sub(3.2,4.1)=-2,故答案为A选项。 24、若变量x、y已正确定义并赋值,以下符合C语言语法的表达式是 A) x+1=y B) ++x,y=x-- C) x=x+10=x+y D) double(x)/10 参考答案:B 【解析】A选项中不能将变量y赋给表达式,C选项中错误与A选项一样,D选项中强制类型转换表达式应写成(double)x/10? 25、设有定义:int x=2;,以下表达式中,值不为6的是( )。 A) 2*x,x+=2 B) x++,2*x C) x*=(1+x) D) x*=x+1 参考答案:A 【解析】A)选项中逗号表达式先计算第一表达式2*x,然后计算第二表达式x+=2的值,即x=x+2即4,整个逗号表达式为第二个表达式的值4,所以选择A)。B)选项中首先计算逗号表达式中第一表达式x++,此时x为3,在执行第二个表达式2*x=2*3=6,所以逗号表达式为第二个表达式的值6。C)选项的赋值表达式可以表示为x=x*(1+x)=2*(1+2)=6。D)选项中的表达式可以表示为x=x*(x+1)=2*3=6。 26、若有以下程序 #include { int a=0,b=0,c=0; c= (a -= ++a), (a+=b, b+=4); printf(\} 则程序的输出结果是 A) 0,4,0 B) 0,4,4 C) 1,4,1 D) 1,4,4 参考答案:A 【解析】逗号运算符的结合性从左到右,因此逗号表达式将从左到右进行计算。且逗号运算符的优先级最低,所以先计算c=(a-=++a)这部分。其中,赋值运算符从右往左计算,先执行++a,a自增1后再赋值,所以a的值为1,执行a=a-1,即a=1-1,a的值为0,并将0赋给变量c?第二部分(a+=b,b+=4),先执行a=a+b,a=0+0,即a的值为0,然后执行b+=4,b=0+4,即b的值为4?所以打印结果为0,4,0,选择A选项? 27、若有以下程序 #include { int a=0,b=0,c=0,d; c= (a+=b,, b+=a); /*第4行*/ d=c;; /*第5行*/ ; /*第6行*/ ;printf(\第7行*/ } 编译时出现错误,你认为出错的是