(二)运算符与表达式
【考点3】常考的C语言运算符
1.C语言运算符简介
●算术运算符:+,-,*,/,%。
●关系运算符:>,>=,==,!=,<,<=。
●位运算符:>>,<<,~,&,|,∧。
●逻辑运算符:!,||,&&。
●条件运算符:?:。
●指针运算符:&,*。
●赋值运算符:=。
●逗号运算符:,。
●字节运算符:sizeof。
●强制运算符:(类型名)(表达式)。
●其他:下标、分量、函数。
2.运算符的结合性和优先级
(1)结合性。所有的单目运算符、条件运算符、赋值运算符及其扩展运算符,结合方向都是从右向左,其余运算符的结合方向是从左向右。
(2)优先级比较。初等运算符>单目运算符>算术运算符(先乘除后加减)>关系运算符 >逻辑运算符(不包括“!”)>条件运算符>赋值运算符>逗号运算符。
初等运算符包括:圆括号(),下标运算符[]和结构体成员运算符->。
3.强制类型转换运算符
(1)可以利用强制类型转换符将一个表达式转换成所需类型。
(2)一般形式:(类型名)(表达式)。
4.逗号运算符和逗号表达式
(1)逗号表达式:用逗号运算符将几个表达式连接起来。
(2)一般形式:表达式1,表达式2,…,表达式n。
(3)求解过程:先求解表达式1,然后依次求解表达式2,直到表达式n的值。表达式n的值就是整个逗号表达式的值。
【考点4】算术运算符和算术表达式
1.基本的算术运算符
(1)分类:+(加法运算符或正值运算符)、-(减法运算符或负值运算符)、*(乘)、/(除)和%(求余)。
其中,“%”运算的两端必须都是整型,其余的运算对象都可以是整型或者实型。
(2)双目运算符两边的数值类型必须一致才能进行运算,如果不一致,系统先进行一致性转换。
转换规则:char->short->int->unsigned->long->float->double。
(3)所有实数的运算都是以双精度方式进行的,若是单精度数值,则需要在尾数后面补0转换为双精度数。
2.算术表达式和运算符的优先级与结合性
(1)定义:用算术运算符和括号将运算量连接起来的、符合C语言语法规则的表达式。
(2)运算对象:函数、常量和变量等。
(3)运算规则。
●可使用多层圆括号,但括号必须配对。运算时由内向外依次计算各表达式的值。
●对于不同优先级的运算符,按运算符的优先级由高到低进行运算,若优先级相同,则按结合方向进行运算。
●若运算符两侧的操作数类型不同,则先利用自动转换或强制类型转换,然后进行运算。
3.自加、自减运算符
(1)作用:自加运算符“++”使运算变量的值增1,自减运算符“--”使运算变量的值减1。
(2)均是单目运算符。运算对象可以是整型或实型变量,但不可以是常量和表达式。
(3)均可作为前缀运算符,也可作为后缀运算符构成一个表达式。
●++i,--i:在使用i之前,先使i的值加1或者减1,再使用此时的表达式的值参加运算。
●i++,i--:在使用i之后,使i的值加1或者减1,再使用此时的表达式的值参加运算。
(4)结合方向:自右向左。
【考点5】赋值运算符和赋值表达式
1.赋值运算符和赋值表达式
(1)“=”称作赋值运算符,作用是将一个数值赋给一个变量或将一个变量的值赋给另一个变量,由赋值运算符组成的表达式称为赋值表达式。
(2)一般形式:变量名=表达式。
●赋值运算符的优先级别高于逗号运算符。
●赋值运算符“=”和等于运算符“==”有很大差别。
●赋值运算符的左侧只能是变量,而不能是常量或者表达式。右侧可以是表达式,包括赋值表达式。
●规定最左边变量所得到的新值就是整个赋值表达式的值。
2.复合的赋值运算符
在赋值运算符之前加上其他运算符可以构成复合赋值运算符。例如,+=、-=、*=、/=、%=等。
●两个符号之间不可以有空格。
●复合赋值运算符的优先级与赋值运算符的相同。
3.赋值运算中的类型转换
如果赋值运算符两侧的类型不一致,在赋值前系统将自动先把右侧表达式求得的数值按赋值号左边变量的类型进行转换(也可以用强制类型转换的方式)。
【考点6】位运算
1.C语言提供6种位运算符
●按位与“&”:若两个相应的二进制位都为1,则该位的结果为1,否则为0。
●按位或“|”:两个相应的二进制位中只要有一个为1,则该位的结果为1,否则为0。
●按位异或“∧”:若两个二进制位相同,则结果为0,不同则为1。
●按位求反“~”:按位取反,即0变1,1变0。
●左移“<<”:将一个数的二进制位全部左移若干位。
●右移“>>”:将一个数的二进制位全部右移若干位。
2.说明
●位运算中除“~”以外,均为双目运算符,要求两侧各有一个运算量。
●运算量只能是整型或字符型数据,不能为实型数据。
真题演练
(1)表达式(int)((double)9/2)-9%2的值是( )。
A)0
B)3
C)4
D)5
(2)若有定义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)
(3)若变量已正确定义,在if(W)printf("%d\n",k);中,以下不可替代W的是( )。
A)a<>b+c
B)ch=getchar()
C)a==b+c
D)a++
(4)若有定义语句:int x=10;,则表达式x-=x+x的值为( )。
A)0
B)-20
C)-10
D)10
(5)设有定义:int x=2;,以下表达式中,值不为6的是( )。
A)2*x,x+=2
B)x++,2*x
C)x*=(1+x)
D)x*=x+1
(6)若有定义语句:int x=12,y=8,z;,在其后执行语句 z=0.9+x/y;,则z的值为( )。
A)1
B)1.9
C)2
D)2.4
(7)表达式3.6-5/2+1.2+5%2的值是( )。
A)4.3
B)4.8
C)3.3
D)3.8
(8)有定义语句:int a;long b;double x,y;,则以下选项中正确的表达式是( )。
A)a=x<>y
B)a%(int)(x-y)
C)(a*y)%b
D)y=x+y=x
(9)设变量已正确定义并赋值,下列表达式中正确的是( )。
A)x=y+z+5,++y
B)int(15.8%5)
C)x=y*5=x+z
D)x=25%5.0
(10)有以下程序:
#include <stdio.h>
main()
{ int x,y,z;
x=y=1;
z=x++,y++,++y;
printf("%d,%d,%d\n",x,y,z);
}
程序运行后的输出结果是( )。
A)2,3,3
B)2,3,2
C)2,3,1
D)2,2,1
(11)以下不能将s所指字符串正确复制到t所指存储空间的是( )。
A)do{*t++=*s++;}while(*s);
B)for(i=0;t[i]=s[i];i++);
C)while(*t=*s){t++;s++}
D)for(i=0,j=0;t[i++]=s[j++];);
(12)设有定义:int k=0;,以下选项的4个表达式中与其他3个表达式的值不相同的是( )。
A)++k
B)k+=1
C)k++
D)k+1
(13)若有定义语句:int year=2009,*p=&year;,以下不能使变量year中的值增至2010的语句是( )。
A)(*p)++;
B)*p++;
C)++(*p);
D)*p+=1;
(14)若有定义:double a=22;int i=0,k=18;,则不符合C语言规定的赋值语句是( )。
A)i=(a+k)<=(i+k);
B)i=a%11;
C)a=a++,i++
D)i=! a;
(15)若变量x、y已正确定义并赋值,以下符合C语言语法的表达式是( )。
A)x+1=y
B)++x,y=x-
C)x=x+10=x+y
D)double(x)/10
(16)若变量均已正确定义并赋值,以下合法的C语言赋值语句是( )。
A)x=y==5;
B)x=n%2.5;
C)x+n=i;
D)x=5=4+1;
(17)以下选项中正确的定义语句是( )。
A)double,a,b;
B)double a=b=7;
C)double a;b;
D)double a=7,b=7;
(18)若有定义语句:int a=3,b=2,c=1;,以下选项中错误的赋值表达式是( )。
A)a=(b=4)=3;
B)a=b=c+1;
C)a=(b=4)+c;
D)a=1+(b=c=4);
(19)表达式 a+=a-=a=9的值是( )。
A)18
B)-9
C)0
D)9
(20)有以下程序:
#include <stdio.h>
main()
{ int a=1,b=0;
printf("%d,",b=a+b);
printf("%d\n",a=2*b);
程序运行后的输出结果是( )。
A)1,2
B)1,0
C)3,2
D)0,0
(21)有以下程序:
# include <stdio.h>
main()
{ unsigned char a=8,c;
c=a>>3;
printf("%d\n",c);
}
程序运行后的输出结果是( )。
A)16
B)1
C)32
D)0
(22)有以下程序:
# include <stdio.h>
main()
{
unsigned char a=2,b=4,c=5,d;
d=a |b;
d &=c;
printf("%d\n",d);
}
程序运行后的输出结果是( )。
A)3
B)4
C)5
D)6
(23)设有以下语句:
int a=1,b=2,c;
c=a^(b<<2);
执行后,c的值为( )。
A)7
B)9
C)8
D)6
(24)若有以下程序段:
int r=8;
printf("%d\n",r>>1);
输出结果是( )。
A)16
B)8
C)4
D)2
(25)有以下程序:
#include <stdio.h>
main()
{ int a=1,b=2,c=3,x;
x=(a^b)&c;
printf("%d\n",x);
}
程序的运行结果是( )。
A)3
B)1
C)2
D)0
(26)有以下程序:
#include <stdio.h>
main()
{ int a=2,b;
b=a<<2;
printf("%d\n",b);
}
程序运行后的输出结果是( )。
A)2
B)4
C)6
D)8
(27)有以下程序:
#include <stdio.h>
main()
{ char a=4;
printf("%d\n",a=a<<1);
}
程序的运行结果是( )。
A)16
B)8
C)40
D)4
(28)有以下程序:
#include <stdio.h>
main()
{ int a=5,b=1,t;
t=(a<<2)|b;
printf("%d\n",t);
}
程序运行后的输出结果是( )。
A)1
B)11
C)6
D)21
(29)若变量已正确定义,则语句s=32; s^=32; printf("% d",s);的输出结果是( )。
A)-1
B)0
C)1
D)32