1、运算符小结 ①左结合方向的运算符: 算术(%必须是整数)、 关系、逻辑、逗号 ②右结合方向的运算符 自增、自减、赋值(赋值号"="左边是必须是变量)、条件 ③运算符的优先次序 ()、!++/--/-转移、算术、关系(<<=>>=)、关系(= = !=)、&&、||、条件(?)、赋值、逗号 ④混合运算中的强制类型转换 ⑤逻辑运算中的求值短路 5>3&&2||8<4-!0 1||∞ (结果1) 0&&∞ (结果0) 如:a&&b&&c a<>0才判断a&&b 例:1) -a++ 相当于 -(a++) 2) x=4,
2、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(整型) 运算符及结合使用性问题 操作符的结合性: 左结合性: 若表达式中相邻的两个操作符优先级相同,先执行那一个操作符?即与前一个操作符的结合性有关。 如果前一个(左边的)操作符具有“由左向右”的结合性
3、则先执行该操作符,否则就处理右边那个操作符 例: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;
4、 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
5、)+(++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);
6、 } ; 输出结果: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”
7、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 = = 相反 != >
8、 <= < >= 等价条件: !( 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
9、 “真” 典型例题分析 例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
10、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
11、",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
12、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 pri
13、ntf("%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
14、" 例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






