资源描述
运算符小结
①左结合方向的运算符:
算术(%必须是整数)、
关系、逻辑、逗号
②右结合方向的运算符
自增、自减、赋值(赋值号"="左边是必须是变量)、条件
③运算符的优先次序
()、!++/--/-转移、算术、关系(<<=>>=)、关系(= = !=)、&&、||、条件(?)、赋值、逗号
④混合运算中的强制类型转换
⑤逻辑运算中的求值短路
5>3&&2||8<4-!0
1||∞ (结果1)
0&&∞ (结果0)
如:a&&b&&c a<>0才判断a&&b
例:1) -a++ 相当于 -(a++)
2) x=4,y=7 求:y+=++x-3 x的值5 y的值9
3) x=4,y=7 求:y=y+++x-3 x的值4 y的值9
4) int a=7;float x=2.5,y=4.7;
求:s=x+a%3*(int)(x+y)%2/4 s的值2.500000
a%3*(int)(x+y)%2 → 1(整型) / 4 (整型) →0.25 →0(整型)
运算符及结合使用性问题
操作符的结合性:
左结合性:
若表达式中相邻的两个操作符优先级相同,先执行那一个操作符?即与前一个操作符的结合性有关。
如果前一个(左边的)操作符具有“由左向右”的结合性,则先执行该操作符,否则就处理右边那个操作符
例:22-19+2*5
由于“-”和“+”这两个相邻的操作符优先级相同,且“-”的结合性为“由左向右”,因此先计算22-19,得3,再计算3+2*5
右结合性:
k=j+=5*i
相邻的操作符“=”和“+=”优先级相同,且“=”具有“由右向左”的结合性,则先处理“+=”,即先要完成表达式j+=5*i的求值;此时,由于“*”的优先级高于“+=”,因此先计算5*i,再执行“+=”完成对j的赋值,最后执行“=”
【例】:
x=4; y=7; x=4; y=7;
y+=x- - +3; y+=++x-3;
得:x为3 y为14 得:x为5 y为9
【例】:
d=5; d=5;
k=++d*2; k=d++*2;
得:k为12 d为6 得:k为10 d为6
【例】:
i=3
z=(i++)+(i++)+(i++)
结果:z值为9 i值为6
(不是3+4+5=12)i=3
如果:z=(++i)+(++i)+(++i)
结果:z值=? i值=? 18,6
【例】:
main()
{ int z,x,y;
x=y=3;
z=x+++y;
printf("z=%d,x=%d,y=%d",z,x,y);
} ;
输出结果:z=6 x=4 y=3
如果:z= -x+++y; 输出结果:z=-1 x=5 y=3
【例】写出下列程序运行结果
main()
{int a=1,b=2,c,d,e;
c=(-a++)+(++b); // a=2 b=3 c=2
d=(b--)+(++a)+a; // a=3 b=2 d=9
e=(a/(++b))-(b/(--a)); // a=2 b=3 e=0
printf(“c=%d,d=%d,e=%d\n”,c,d,e);
}
运行结果如下
c=2,d=9,e=0
【例】
如果:a=3; 求:a+=a-=a*a;
[有:1) a*a; 2)a= a-(a*a); 3) a+=-6 ]
结果值为:-12
【例】
a=2*5,a*3; a值为10 结果值为:30
(先求:a=2*5,后求:a*3)
x=(a=2*5,a*3),a+4 x值为30 结果值为:34
相反条件:
x > y x <= y
= = 相反 !=
> <=
< >=
等价条件:
!( x= =y) x!=y
!( x! =y) x=y
!( x > y) x<=y
!(E1&&E2) !E1||!E2
!(E1||E2) !E1&&!E2
!( x= =y) x!=y
永假条件:
x < 3 && x >15 “假”
永真条件:
y > 0 | | y<=0 “真”
典型例题分析
例1
int i=5,j=5,x;
x=(++j)+(++j)+(++j);
printf("%d,%d",(++i)+(++i)+(++i),x);
i=21,tc2.0运行结果。因为。6+7+8=21
x=24, “++”比“+”的优先级高
例2
ch='a'; /*a=97*/
printf("%x,%o",ch,ch,); 61,141(16进制、8进制)
例3
x=5;
y=2+(x+=x++,x=8,++x); 结果x=9,y=11
逗号运算顺序为从左向右,即等于:
x+=x++;//x==11 x=8;//x==8 ++x;//x==9 y=2+9=11
例4
int k=-1;
printf("k1=%d,k2=%u",k,k);
k1=-1,k2=65535(u无符号数)
例5
int a=b=c=-1;
++a&&++b&&++c 求 a,b,c的值 a=0,b=-1,c=-1(求值短路)
++a||++b||++c 求 a,b,c的值 a=0,b=0,c=0
例6
sum=pad=5; pad=sum+ +,pad+ + ,+ + pad;
printf("%d\n",pad); pad=7,sum=6
例7
int i=010,j = 10;
printf("%d,%d\n",++i,j--); 9,10
例8
int a=-3;
a+=a-=a*a; -24
例9设有语句char a='\072';则变量a ( )。
A)包含1个字符 B)包含2个字符
C)包含3个字符 D)说明不合法
a=’:’
例10
int a=2,c=5;
printf("a=%%d,b=%%d\n",a,c); a=%%d,b=%%d
例11
int a ,b,d=241;
a=d/100%9;
b=(-1)&&(-1);
printf("%d,%d\n",a,b); a=2 b=1,先d/100=2 后2%9
例12
int a=2、b=3、c=4;
a*=16+(b++)-(++c); a=2*(16+3-5)=28
例13合法赋值语句是
a=7+b+c=a+7;
a=7+b++=a+7;
a=7+b,b++,a+7 (合法)
a=7+b,c=a+7; (合法)
例14
int a;
printf("%d\n",(a=3*5,a++*4,a+++5)); 21
printf("%d\n",a=(a=3*5,a*4,a+5)) ); 20
printf("%d\n",a=3*5,a*4,a+5); 15
例15
int x=10,y=3,z;
printf("%d\n",z=(x%y,x/y)); 3
printf("%d\n",z=x%y,x/y); 1
例16 10!=9的值 1
例17不正确的赋值语句
++t;
n1=(n2=(n3=0));
k=i==j;
a=b+c=1; 不正确
例18合法的字符常量是
'\084'
'\x43' 合法
'ab'
"\0"
例19
double x,y ;
x=1,y=x+3/2; 2.000000
例20
int u=010,v=0x10,w=10;
printf("%d,%d,%d\n,u,v,w); 8,16,10
例21
int a=1,b=2,c=3,d=4;
a<b?a:c<d?a:d 1
例22
int x;
x=10;
x+=x-=x-x; 20
例23
int x,y,z,t;
x=y=z=1;
t=++x||++y&&++z; 1
例24
int x,y,z,k;
x=(y=4,z=16,k=32) 32
例25
int k=7 ,x=12;
能使值为3的表达式是
x%=(K%=5)
x%=(k-k%5)
x%=k-k%5
(x%=k)-(k%=5)
例26
int x,y
x+=y;y=x-y;x-=y;
功能
A)把x 和y按从大到小排列
B)把x和y按从小到大排列
C)无确定结果
D)交换x和y中的值
例27
unsigned int x
x=65535;
printf("%d\n",x); -1
printf("%d\u",x); 65535
展开阅读全文