c语言.docx
《c语言.docx》由会员分享,可在线阅读,更多相关《c语言.docx(13页珍藏版)》请在冰豆网上搜索。
c语言
6.假设所有变量均为整形,则表达式(a=2,b=5,b++,a+b)的值是(b)。
a)7b)8c)6d)2
逗号表达式,返回的是最后一个下面
7.四个选项中,均是不合法的用户标示符的选项是__c___
a)AP_0do
b)floatla0_A
c)b-agotoint
d)_123tempINT
C语言规定的标识符只能由字母、数字、下划线三种字符组成,第一个字符必须为字母或下划线,并且不能使用c语言中关键字作为标识符。
而选项c中的goto和int是关键字,b-a中的“-”不是组成标识符的三种字符之一。
14.在c语言中,要求运算数必须是整型的运算符是__d______.
a)/b)++c)!
=d)%
%整除求余运算,两个运算数必须是整型
17.设变量a是整型,f是实型,i是双精度型,则表达式10+'a'+i*f值的数据类型为___c____.
a)intb)floatc)doubled)不确定
∙首先计算i*f,因为i为double,f是float,按照自动转换规则,编译器将其结果转换为double
∙然后计算a+i*f,此时+号后面是double,a是整形,因此编译器首相将a转换为double然后进行结算
结果是double
18.以下程序的输出结果是__d______.(注意:
_表示空格)
main()
{
printf("\n*s1=%15s*","chinabeijing");
printf("\n*s2=%-5s*","chi");
}
a)*s1=chinabeijing___*b)*s1=chinabeijing___*
*s2=**chi**s2=chi__*
c)*s1=*__chinabeijingd)*s1=___chinabeijing*
*s2=**chi**s2=chi__*
%ms:
输出的字符串占m列,如果字符串本身长度大于m,则突破获m的限制,将字符串全部输出。
若串长小于m,则左补空格。
%-ms:
如果串长小于m,则在m列范围内,字符串向左靠,右补空格。
19.阅读以下程序,当输入数据的形式为:
25,13,10,正确的输出结果为___d___.
main()
{
intx,y,z;
scanf("%d%d%d",&x,&y,&z);
printf("x+y+z=%d\n",x+y+z);
}
a)x+y+z=48
b)x+y+z=35
c)x+z=35
d)不确定值
25,13,10这里的逗号,
正确的输入形式为251310
以空格或回车键分割
21.若有以下定义,则正确的赋值语句是__b________.
inta,b;floatx;
a)a=1,b=2,b)b++;c)a=b=5d)b=int(x);
A是赋值语句,句子和句子之间用分号隔开。
而D是强制性转化,应该写成(int)x。
C中,c语言是允许这样赋值的,但是最后缺分号。
至于B的话,其实,a,b都没有初始化,是一个任意值,不过语法来说的话,B是正确的相当于b=b加1
22.逻辑运算符两侧运算对象的数据类型___d_
a)只能是0或1
b)只能是0或非0正数
c)只能是整型或字符型数据
d)可以是任何类型的数据
如果是C语言,并且不是按位逻辑运算,答案肯定是D
因为C中的规定是非零数字表示真,0表示假,而逻辑运算就是对真假进行计算,所以在C中是任何类型的数据都可以进行逻辑运算,只要是非零数字就会被认为是真,再进行逻辑运算时按真处理。
如果是C语言,并且是按位逻辑运算(比如按位与&运算符),答案C正确,答案A肯定错。
因为对于按位逻辑,是进行的二进制按位计算,因此要求两侧操作数是整型,当然字符型数据可以按ASCII码自动转换为整型,所以字符数据也可以进行按位逻辑运算。
按位逻辑运算不可能只能对0或者1进行计算,因为那样的话就失去意义了,只能对0或者1操作还有什么意义,就是4种结果,可能吗?
23.以下关于运算符优先顺序的描述中正确的是__c___.
a)关系运算符<算术运算符<赋值运算符<逻辑与运算符
b)逻辑与运算符<关系运算符<算术运算符<赋值运算符
c)赋值运算符<逻辑与运算符<关系运算符<算术运算符
d)算术运算符<关系运算符<赋值运算符<逻辑与运算符
算术、关系、逻辑运算符
用来表示各种运算的符号称为运算符。
例如,数值运算中经常用到的加、减、乘、除符号就是运算符。
由于它们是进行算术运算的,所以称为算术运算符。
运算符必须有运算对象。
C语言中的运算符的运算对象可以是一个,称单目运算符;运算对象也可以是两个,称双目运算符;运算对象还可以是三个,称三目运算符。
单目运算符若放在运算对象的前面称为前缀单目运算符;若放在运算对象的后面称为后缀单目运算符。
双目运算符都是放在两个运算对象的中间。
三目运算符在C语言中只有一个(条件运算符),是夹在三个运算对象之间的。
每个运算符都代表对运算对象的某种运算,都有自己特定的运算规则。
每个运算符运算的对象都规定了数据类型,同时运算结果也有确定的数据类型。
用运算符把运算对象连接起来所组成的运算式在C语言中称为"表达式"。
每个表达式都可以按照运算符的运算规则进行运算,并最终获得一个值,称为表达式的值。
当表达式中出现多个运算符,计算表达式值时,就会碰到哪个先算,哪个后算的问题,我们把这个问题称为运算符的优先级。
计算表达式值时,优先级高的运算要先进行。
注意,在复杂的表达式中,用圆括号括住的部分要先算,其优先级别高于任何运算符。
若在圆括号中又有圆括号,则内层圆括号优先于外层圆括号。
┌基本算术运算符(+,-,*,/,%)
┌算术运算符┤
│ └增1减1运算符(++,--)
│
│关系运算符(>,<,==,>=,<=,!
=)
│逻辑运算符(!
,&&,||)
│
│ ┌基本赋值运算符(=)
┌基本运算符┤赋值运算符┤
│ │ └算术自反赋值运算符(+=,-=,*=,/=,%=)
│ │
│ │逗号运算符(,)
│ │条件运算符(?
:
)
C语言运算符┤ │数据长度运算符(sizeof)
│ │
│ │ ┌位逻辑运算符(~,&,|,^)
│ └位运算符┤位移位运算符(>>,<<)
│ └位自反赋值运算符(&=,|=,^=,>>=,<<=)
│
│ ┌强制运算符(( ))
└专用运算符┤下标运算符([])
│成员运算符(->,.)
└指针运算符(&,*,+,-)
C语言运算符分类
注意C语言中的运算符都是键盘上的符号(如|、~、^等)或若干符号的组合(如&&、||、>>、<<、->等),书写或输入时不要出错。
此外,少数运算符号有双重含义,主要有下列几个:
(1)"+"号。
在算术运算中既表示单目的取正运算,又可表示双目的加法运算,在指针运算中表示双目的加法运算。
(2)"-"号。
在算术运算中既表示单目的取负运算,又可表示双目的减法运算,在指针运算中表示双目的减法运算。
(3)"*"号。
在算术运算中表示双目的乘法运算,在指针运算中表示指针变量指向的变量。
(4)"&"号。
在位逻辑运算中表示双目"与"运算,在指针运算中表示取地址的运算。
这些两重含义运算符的理解与当时的运算对象有关,在学习时要注意区分。
一、算术运算符
算术运算符包括基本算术运算符和增1、减1运算符,其中基本运算符常简称为算术运算符。
1.基本算术运算符
基本算术运算符是对数据进行简单算术运算的。
要注意字符型数据也可以看成整型数据,参加基本算术运算。
对象数
名称
运算符
运算规则
运算对象
运算结果
结合性
单目
正负
+
-
取原值
取负值
整型或实型
整型或实型
自右向左
双目
加
减
乘
除
+
-
*
/
加法
减法
乘法
除法
自左向右
模
%
整除取余
整型
整型
双目加(+)、减(-)、乘(*)运算和普通算术运算中的加法、减法和乘法相同。
例如,2.1+3.6的结果是5.7;2.1-3.6的结果是-1.5;2.1*3的结果是6.3。
双目除运算(/)和运算对象的数据类型有关。
若两个对象都是整型数据,该运算称为"整除",即获得的商是整数。
若商有小数,则截去小数部分。
若两个运算对象有一个或两个都是实型,则运算结果是实型。
例如,14/5,结果为2;而14/5.0,则结果为2.8。
双目模运算(%)的对象必须是整型数据,结果是整除后的余数。
例如,14%5的结果为4(商为2);14%4的结果为2(商为3)。
注意运算结果的符号与被除数相同,例如,13%3、13%-3的结果均为1(商分别为4、-4);-13%3、-13%-3的结果均为-1(商分别为-4、4)。
算术运算符的优先级规定如下:
⑴单目基本算术运算符 优先于 双目基本算术运算符
⑵*、/、% 优先于 +、-
⑶同级单目基本算术运算符的结合性是自右向左
⑷同级双目基本算术运算符的结合性是自左向右
【例】基本算术运算符的使用。
设变量定义如下:
intn=10,m=3;
floatf=5.0,g=10.0;
doubled=5.0,e=10.0;
则:
-n的结果是-10
n+m、n-m、n*m、n%m的结果分别为13、7、30、3、1
d+e、d-e、d*e、d/e的结果分别为15.0、-5.0、50.0、0.5
n+m-f*g/d的运算顺序相当于(n+m)-((f*g)/d),结果是3.0
n%m*f*d的运算顺序相当于((n%m)*f)*d,结果是25.0
2.增1减1运算符
增1减1运算符都是单目运算符,是用来对整型、字符型、指针型以及数组的元素等变量进行算术运算的,运算的结果仍是原类型,并存回原运算对象。
用增1减1运算符和运算对象组成表达式时,运算符可以放在运算对象的前面(称前缀),也可以放在运算对象的后面(称后缀),前缀和后缀的功能略有不同。
增1(或减1)运算符作为前缀使用时,是先对运算对象加1(或减1),然后再使用加1(或减1)后的运算对象。
增1(或减1)运算符作为后缀使用时,是先使用不加1(或减1)的运算对象,然后再对运算对象加1(或减1)。
对象数
名称
运算符
运算规则
运算对象
运算结果
结合性
单目
增1(前缀)
增1(后缀)
减1(前缀)
减1(后缀)
++
++
--
--
先加1,后使用
先使用,后加1
先减1,后使用
先使用,后减1
整型或
字符型或
指针型或
下标等
同运算对
象的类型
自右向左
增1减1运算符的优先级如下:
⑴增1减1运算符优先于双目基本算术运算符
⑵增1减1运算符和单目基本算术运算符+、-同级别,结合性是自右向左
例如,设整型变量a为2,则:
++a+1结果为4,变量a为3
a--+1结果为3,变量a为1
当出现难以区分的若干个+或-组成运算符串时,C语言规定,自左向右取尽可能多的符号组成运算符。
例如,设整型变量a、b均为2,则:
a+++b应理解成(a++)+b,结果为4,a为3,b不变
a---b应理解成(a--)-b,结果为0,a为1,b不变
【例】增1减1运算符的使用。
设变量定义如下:
charc1='b',c2='B';(c1、c2可看成整型,其值分别为98、66)
则:
++c1的值是99,运算后c1的值是'c'
c1--的值是98,运算后c1的值是'a'
c1+++c2的值是164,运算后c1的值是'c',c2的值是'B'
c1---c2的值是32,运算后c1的值是'a',c2的值是'B'
二、关系运算符
关系运算符是用来比较两个数据大小的,运算的结果是成立或不成立。
如果成立,则结果为逻辑值"真",用整数"1"表示;如果不成立,则结果为逻辑值"假",用整数"0"表示。
对象数
名称
运算符
运算规则
运算对象
运算结果
结合性
双目
小于
小于或等于
大于
大于或等于
等于
不等于
<
<=
>
>=
==
!
=
满足则为真,
结果为1
不满足为假,
结果为0
整型
或
实型
或
字符型
等
逻辑值
(整型)
自左向右
所有关系运算符都是双目运算符,所组成的表达式称为关系表达式。
关系表达式的结果是逻辑值,若为"真"用整数1表示;若为"假"用整数0表示。
关系运算符可以用来比较两个数值型数据的大小,也可以比较两个字符型数据的大小。
字符数据比较时是按该字符对应的ASCII代码值的大小进行比较,其实质也是数值比较。
关系运算符的优先级如下:
⑴ 算术运算符优先于关系运算符
⑵ <,<=,>,>=优先于==,!
=
⑶ <,<=,>,>=同级,结合性是自左向右
⑷ ==,!
=同级,结合性是自左向右
因此,"3<2<2"作为关系式来说是正确的,先计算"3<2"的结果为"0"(假);再计算"0<1"的结果是"1"(真)。
当然,这个计算过程与原式数学中的含义(3<2并且2<1)是不同的,这一点请同学们特别注意。
【例】关系运算符的使用。
设变量定义如下:
charc1='a',c2='A';(c1、c2可看成整型,其值分别为97、65)
intn1=65,n2=97;
floatf1=0.3E1,f2=3.0001;
则:
c1>c2、n1 c1>=n1、c2>=n2、c1==n2的值依次是1、0、1
f1>c1、f2 c1>c2>=1<=0==1!
=0的值是0 注:
运算顺序相当于((((c1>c2)>=1)<=0)==1)!
=0
c1>c2>=n1<=n2==f1!
=f2的值是1 注:
运算顺序相当于((((c1>c2>)=n1)<=n2)==f1)!
=f2
三、逻辑运算符
逻辑运算符是对两个关系式或逻辑值进行运算的,运算结果仍是逻辑值。
在C语言中,逻辑值是用数值非0和0来表示逻辑真和假的,所以逻辑运算符也可以对两个数值型数据进行运算,包括整型、实型、字符型等数据。
对象数
名称
运算符
运算规则
运算对象
运算结果
结合性
单目
逻辑非
!
参看下表
数值型或
字符型等
逻辑值
(整型)
自右向左
双目
逻辑与
逻辑或
&&
||
自左向右
a
非运算 !
a
0(假)
非0(真)
1(真)
0(假)
对象1a
对象2b
与运算a&&b
或运算a||b
0(假)
0(假)
非0(真)
非0(真)
0(假)
非0(真)
0(假)
非0(真)
0(假)
0(假)
0(假)
1(真)
0(假)
1(真)
1(真)
1(真)
注意其中的&&是由2个"&"组成的,||是由2个"|"组成的。
单目逻辑运算符(!
)是前缀运算符,双目逻辑运算符是插在两个运算对象中间,所组成的表达式称为逻辑表达式。
逻辑表达式的运算结果是逻辑值。
若运算结果为逻辑真,则获得1;若运算结果是逻辑假,由获得0。
要特别注意逻辑真的表示方法,对参加运算的逻辑真,是用非0值来表示的;而运算结果的逻辑真是用数值1来表示的。
而对逻辑假,不管是参加运算,还是运算结果,都是用数值0来表示的。
逻辑运算符的优先级如下:
⑴ !
优先于 双目算术运算符 优先于 关系运算符 优先于 && 优先于 ||
⑵ 单目逻辑运算符!
和单目算术运算符是同级别的,结合性是自右向左
⑶ 双目逻辑运算符的结合性是自左向右
!
的结合性是自右向左的,即先计算最右边的!
,再依次向左计算其它的!
。
例如,!
!
!
10的计算顺序相当于!
(!
(!
10)),结果为0。
&&和||的结合性是自左向右的,即先计算最左边的&&(或||),再依次向右计算其它的&&(或||)。
例如,10&&1&&0的计算顺序相当于(10&&1)&&0,结果为0。
又如,0||0||5的计算顺序相当于(0||0)||5,结果为1。
还要提醒读者注意的是,用&&对两个表达式进行计算时,若第一个表达式的值为"假",则运算结果与第二个表达式的值无关,结果肯定为"假",所以C语言规定此时第二个表达式将不再计算。
同样用||对两个表达式进行计算时,若第一个表达式的值为"真",则运算结果与第二个表达式的值无关,结果肯定为"真",所以C语言规定此时第二个表达式也不再计算。
例如定义a为整型变量,则0&&(a++)的运算结果为0,a值不变;1||(a++)的运算结果为1,a值也不变。
【例】逻辑运算符的使用。
设变量定义如下:
charc1='a',c2='A';(c1、c2可看成整型,其值分别为97、65)
intn1=65,n2=97;
floatf1=3.0,f2=3.0001;
则:
!
c1的值是0,n1&&n2的值是1,f1||f2的值是1,!
(c2>c1)的值是1,!
n2>n1的值是0,f1>f2||!
c1的值是0,n1+32==n2&&n1==c2的值是1。
25.判断char型变量ch是否为大写字母的正确表达式是__c_____.
a)'A'<=ch<='Z'b)(ch>='A')&(ch<='Z')
c)(ch>='A')&&(ch<='Z')d)('A'<=ch)AND('Z'>=ch)
A65,a97
29.设有:
inta=1,b=2,c=3,d=4,m=2,n=2;
执行(m=a>b)&&(n=c>d)后n的值为___b____.
a)1b)2c)3d)4
n的值仍然为2,没有改变!
过程:
先计算a>b,值为0,赋给m的值为0,表达式m=a>b的值也是0。
对于&&逻辑运算,不管后面(n=c>d)的值如何,都不影响(m=a>b)&&(n=c>d)的最终结果,因此,C语言不再对表达式n=c>d进行计算。
因而n的值没有改变!
!
30.已知intx=10,y=20,z=30;以下语句执行后x,y,z的值是_________.
if(x>y)
z=x;x=y;y=z;
a)x=10,y=20,z=30b)x=20,y=30,z=30
c)x=20,y=30,z=10d)x=20,y=30,z=20
如果X>Y 执行Z=X,因为X不大于Y,所以Z=X这句话不执行,继续向下执行
36.下面程序段的运行结果是__a_______.
a=1;b=2;c=2;
while(a
printf("%d,%d,%d",a,b,c);
a)1,2,0b)2,1,0c)1,2,1d)2,1,1
a
1<2为1,1若有下面的程序段:
chars[]="china";char*p;p=s;则下列叙述正确的是___D_____问题在下边,求详解
2012-12-2014:
121211情分类:
Windows|浏览1965次
A)s和p完全相同B)数组s中的内容和指针变量p中的内容相等
C)s数组长度和p所指向的字符串长度相等D)﹡p与s[0]相等
答案:
D
A:
s是字符数组,p是指向字符串的指针
B:
显然数组s中的内容和指针变量p中的内容不相等,应该换一种说法“数组s中的内容和指针变量p所指向的字符串的内容相等”
C:
s数组的长度为6(包含结束符'\0'),p所指向的字符串长度为5
D:
*p='c',s[0]='c'
37.有下面的程序段
chara[3],b[]="China";
a=b;
printf("%s",a);
则_____d__.
a)运行后将输出ChinaB)运行后将输出Ch
b)运行后将输出ChiD)编译出错
D.编译出错
原因是空间不够
数组a中的空间只有3
b中放到a中溢出
38.判断字符串s1是否大于字符串s2,应当使用__d_____.
a)if(s1>s2)b)if(strcmp(s1,s2))
c)if(strcmp(s2,s1)>0)d)if(strcmp(s1,s2)>0)
strcmp是比较两个字符串的大小,两个字符串相同时返回0,第一个字符串大于第二个字符串时返回一个正值,否则返回负值.
比较两个字符串的算法是:
逐个比较两个串中对应的字符,字符大小按照ASCII码值确定,从左向右比较,如果遇到不同字符,所遇第一对不同字符的大小关系就确定了两个字符串的大小关系,如果未遇到不同字符而某个字符串首先结束,那么这个字符串是较小的,否则两个字符串相等。
39.下面描述正确的是___d__.
a)两个字符串所包含的字符个数相同时,才能比较字符串
b)字符个数多的字符串比字符个数少的字符串大
c)字符串"STOP"与"STOP"相等
d)字符串"That"小于字符串"The"
b错,字符串比较是从左到右第一个不一样第开始比较哪个大就哪个大,和字符串的长度没关系,当一个字符串短,他和长第字符串比较,长字符串前面和短字符串完全相同,那么长字符串大。
c前一个字符串末尾有一个空格,后一个则没有,所以不相等。
40.若有说明;int*p,m=5,n;以下正确的程序段的是____d____.
a)p=&n;b)p=&n;
scanf("%d",&p);scanf("%d",*p);
c)scanf("%d",&n);d)p=&n;
*p=n;*p=m;
D是正确的
A,B中p是n的地址那么如果要输入n应该是scanf("%d",p);
C中p还没定义给*p赋值就是给一个没有开辟的地址赋值了
D是正确