1.如:int a=10,b=6,c;
如果c=a/b;
此时的c=1,因为整型的除法不是四舍五入,只保留小数位之前的数。
2.A&&B:当A(非零值)是真,且B(非零值)是真,才会返回1,表示真;否则,返回0,表示假。
A||B:当A(非零值)是真,或者B(非零值)是真,会返回1,表示真;否则,返回0,表示假。
!A,将A取反,假设A的值或者表达式为真,则表示假。
3.f=(1,2,3),(4,5,6)
运行后f的值为3,因为在一对圆括号内并且用逗号分割时,取值只取最后一个元素,值为3;
并且赋值取的是逗号左边的表达式和值,因此后一个圆括号不做考虑。
4.(double)(20/3)
解法为先计算20/3取整为6,再强制转换为double类型,答案为6.0。
5.ch='a+b'是错的。
因为字符只能保存单个值,而ch='a'+'b'是正确的。
6.已知a为整型变量,那么与表达式 a!=0 真假值情况不同的表达式是( D )
A)a>0||a<0 B) a C)!a==0 D) !a
表达式 a!=0 ,如果a本身为0,a!=0逻辑为假。如果a为非0值,a!=0为真
A:||是左右两边其中一个是真,那么表达式就为真。
B:a本身不为0,所有非零值即视为真。
C:左边是取反操作,所有非零值的反向逻辑值都是0,而==是判断,0肯定等于0,所以逻辑为真。
D:情况与a!相反
7.x=j>0成立
j>0可以看作是判断真假,返回1或0。
8.已有定义int x=3,y=4,z=5;则表达式 !(x+y)+z-1&&y+z/2的值是?
①括号内先运算:!7+5-1 && 4+5/2
②!7,为真,取反为0: 0+5-1 &&4+5/2
③化简计算:4 && 6
&&两边都为真,返回1。
9.逻辑运算符运算对象的数据类型是()
——>任何类型的数据。
10.能正确表示X的取值范围在[0,100]和[-10,-5]内的表达式是
[-10,-5]:x>=-10&&x<=-5
[0,100]:x>=0&&x<=100
虽然是在[0,100]和[-10,-5]内,但是中间用||分开,因为不可能会同时取两者的值
11.以下程序的运行结果是:
int main(){
int c,x,y;
x=1;y=1;c=0;
c=x++||y++;
printf("%d%d%d/n",x,y,c);
}
——>2,1,1
从c=x++||y++;这一句来看,中间用||分割,首先考虑x++是否为真,x++不为0,真,x=x+1=2,c=1。
由于x++判断为真,所以y++并没有执行,y还是等于1。
12.以下程序的运行结果是:
int main(){
int c,x,y;
x=0;y=0;c=0;
c=x++&&y++;
printf("%d%d%d/n",x,y,c);
}
——>1,0,0
由于符号为&&,执行x++,x为0,返回假,x=x+1=1
13.以下程序的运行结果是:
int main(){
int x=y=1;
z=x++-1;
printf("%d%d",x,z);
z+=-x+++(++y||++z);
printf("%d%d%",x,z);
}
——>2,0,3,-1
①z=x++ -1,x++由于x的值是后增加的,此时x为1,z=1-1=0。
②z+=-x+++(++y||++z),首先看括号内的++y,真,返回1,++z,z=0,假,返回0,由于||关系,返回1。
所以-x++ +1,此时x=2,-2+1=-1,z=z+-1=-1,x执行过x++后,此时x的值为3。
14.与条件表达式(n)?(c++):(c--)中的表达式(n)等价的表达式是()
——>n!=0
条件表达式实际上就是if语句
if(n) ——实际上n为真,n不为零
c++;
else
c--;
n!=0,n不等于零,所以两者等价。
15.表达式sizeof(double)是()
——> int型表达式
不能被double误导,实际上sizeof()是一个运算符号返回的是字节长度,返回值为int类型,所以是int型表达式。
16.已知:char a;int b;float c;double d;则执行语句c=a+b+c+d;后,变量c的数据类型是 ()
——>float
①语句c=a+b+c+d;根据计算类型转换,在计算中确实被转换为double类型进行计算。
②由于c被声明为float类型,所以返回值被返回为float类型的值。
17.若已知a=10,b=10,则表达式!a<b的值为()
——>1
①根据C语言运算符顺序,!比<优先,先计算!a,为假,返回0
②0<b,真,返回1
18.语句printf("abre'hi'y\bou");的输出结果是()
——>re'hi'you
最大错误是把特殊字符看作斜杠和字符。
①实际上可以分解为a,b,r,e,',h,u,',y,\,b,o,u
②很容易理解b为退格符,'为单引号,\为
③因此a被退格删除,被退格删除,输出结果
19.若有以下程序段:int c1=5,c2=3,c3;c3=12.0/c1*c2;则执行后,c3中的值是()
——>7
错误想法:①c1*c2=15②c3=12.0/15=0
实际上,c语言从左到右进行运算,因此在这个情况下先除再乘
12.0/5*3,计算出结果后再保存为int类型,所以答案为7
20.在C语言中,要求所有变量,遵循先定义后 使用 的原则
21.有符号的整型常量可以分为 int、short、 long、 longlong
22.在C语言中,实数有两种表现形式 指数形式、小数形式
23.int型的取值范围 16位:-32768,32767 32位:-2147483648, 2147483647
24.在C语言中,加减乘除这些运算符需要两个运算对象,称为 双目 运算符
25.罗技运算符的优先级是 ! 高于 && 高于 ||
26.表示“整数x的绝对值大于5”的C语言表达式是 x<-5||x>5
27.设x=2.5,a=7,y=4.7,求下面算数表达式的值:x+a%3*(int)(x+y)%2/4;
——>2.5
①2.5+7%3*(int)(2.5+4.7)%2/4;
②2.5+7%3*7%2/4;
③2.5+1*7%2/4; //计算按照从左往右,想当然的先计算3*7导致的错误
④2.5+7%2/4;
⑤2.5+1/4;
⑥2.5+0=2.5
28.表达式5%(-3)的值是()表达式-5%-3的值是()
——>2,-2
5%(-3),取-1,余2
-5%-3,取1,余-2
29.设变量r的值为某个角度的值,则其弧度的表达式是 r*3.1415926/180
30.若x为int类型,请以最简单的形式写出与逻辑表达式!x等价的C语言表达式 x==0
31.以下程序的运行结果是()
——>333
#include<stdio.h>
int main(){
int x1=0xabc,x2=0xdef;
x2-=x1;
printf("%xn",x2);
return 0;
}
十六进制字母不区分大小写,A-F为10-16
x1为16进制abc即为十进制2748
a*16的2次方,b*16的1次方,c*16的0次方
x2为16进制def即为十进制3567
d*16的2次方,e*16的1次方,f*16的0次方
x2-x1为819,转换16进制即为333
819%16=333
printf("%X.."....)中%X表示十六进制输出,默认不输出0x
32.已知有如下定义和输入语句,若要求a1,a2,c1,c2的值分别为10,20,A,B,正确的数据输入为()
——>scanf("%d%c %d%c",&a1,&c1,&a2,&c2); //因为%c字符类型会读入空格,之间不能空格
int a1,a2;
char c1,c2;
printf("%d%d%c%c",a1,a2,c1,c2);
33.写出程序的运行结果()
——>a=374 a=0374
——>a=fc a=0Xfc
int main(){
int a=282;
printf("a=%o a=%#on",a,a);
printf("a=%x a=%#xn",a,a);
}
解释:因为%o格式符输出八进制,#表示输出完整八进制位数;同理,%x输出十六进制,#表示输出完整十六进制位数
34.scanf处理输入数据时,遇到以下情况该数据认为结束 空白字符 、 非法字符 、 已读完要求位数。
35.int a=1234;printf("2dn",a);
——>1234
解释:%2d,输出整形格式数据,2表示位宽,不足2位时用0补足。因为a明显超过2位位宽,所以直接输出1234。
如果是scanf("2dn",a);输入的是1234,会出现截取,此时a=12
%-2d
输出2位位宽数据,若字符串本身长度大于2,则将数字全部输出,若数字本身长度小于2,则在右边补上空格
%e:e表示10的N次方,默认输出有效数字7位,1位是整数,6位小数,指数3位(不足3位时填0)。
printf("%en",123.54) 结果为1.235400e+002
36.写出程序的运行结果()
int main( ){
char c1='6',c2='0';
printf("%c,%c,%d,%dn",c1,c2,c1-c2,c1+c2);
}
——>6,0,6,102
解释:c1-c2='6'-'0'=6;实际上不是数值的计算,而是ASCII码的运算。
‘6’的ASCII码是54,而‘0’是48,53-48=6,而输出的数值所以是6。
c1+c2=54+48=102
37.在scanf函数的格式的控制中,格式说明的类型与输入的类型应该一一对应匹配。如果类型不匹配,则系统()
——>并不给出错误信息,但不可能得出正确信息数据
38.写出程序的运行结果()
int main( ){
long y=-34567;
printf("%-8ldn",y);
printf("%-08ldn",y);
printf("%08ldn",y);
printf("%+8ldn",y);
}
——>y=-34567
——>y=-34567
——>y=-0034567
——>y= -34567
解释:无符号表示右对齐,“-”号表示左对齐,“+”号表示在数字前面添上数字的符号。“0”表示对空白字段填充“0”,默认填充空格
1.-34567,一共5位数字+一个符号,6个宽度;-8,8位宽度并左对齐,-34567空格空格,由于换行所以空格"隐形"了
2.-08,对空白字符填充0,但因为左对齐,所以没有填充0
3.08,缺省,是右对齐,负号后面空出两个空格,因为用0填充,所以-0034567
4.+8,右对齐,+表示符号是填上的,用空格填充,空格空格-34567
39.写出程序的运行结果()
int main( ){
int a=5,b=0,c=0;
if(a=b+c)
printf("***n");
else
printf("$$$n");
}
解释:if(a=b+c),a=b+c是一个赋值语句,它返回的值为a的值为0
40.设有程序片段如下:
switch(class)
case 'A':printf("GREAT!");
case 'B':printf("GOOD!");
case 'C':printf("OK!");
case 'D':printf("NO!");
default:printf("ERROR!");
若class值'C',输出的结果是()
——>OK!NO!ERROR!
解释:没有break语句所以一直从case 'C'执行下去,注意的是default也被执行
41.得到整型变量a的一个正整数的数字位表达式为()
——>a/10%10
拓展:个位:a%10;十位:a/10%10;百位a/100%10;千位a/1000%10;
42.int i=1;则执行语句while(i++<4);后变量i的值为()
——>5
①while(1++<4)②while(2++<4)③while(3++<4)④while(4++<4)不满足循环条件,i=4++=4+1=5
42.写出程序的运行结果()
int main( ){
int y=10;
while(y--)
printf("y=%d",y);
——>y=-1
①y=10,y--,y=9 ... ②y=0,y--,y=-1
43.若变量已正确定义,要求程序完成5!的计算,不能完成此操作的程序是()
——>for(i=1;i<=5;i++){p=1;p*=i;}
解释:一个正整数的阶乘所有小于及等于该数的正整数的积,那么5!=1*2*3*4*5
而p=1在循环中导致每次p都被初始化为1,到最后只能p=1*5
44.int k=-20;while(k=0) k=k+1;循环体执行了几次()
——>循环体语句一次也不执行
解释:while(k=0),k=0赋值,k为0,循环终止
45.定义如下变量:int n=10; 则下列循环的输出结果是()
while(n>7){
n--;
printf("%dn",n);
}
——>10
——>9
——>8
——>7
46.当输入为quert?时,下面程序的执行结果是()
int main(){
while(putchar(getchar()))!='?');}
——>quert?
解释:putchar()里嵌套了getchar()读取字符,当读到?的时候读取结束,正好全部读完
47.C语言浮点数:①十进制小数②指数:e或E之前有数字,后面必须为整数
48.关于long、int、short型的数据占用内存大小的描述,正确的是()
——>由C语言编译系统决定
49.若有说明:int a[10];则对a数组元素的正确引用是()
——>a[10-10]
解释:a[10-10]等价于a[0]
50.将一个空格赋给字符变量c,正确的赋值语句是()
A)c='