第七章 运算符和表达式第七章 运算符和表达式
7.1 运算符
算术运算符,+、-,*,/,%
关系运算符,>,<,==,>=,<=、! =
逻辑运算符:!,&&,||
位运算符,<<,>>,~,|,^,&
赋值运算符,=及其扩展赋值运算符
条件运算符:?:
逗号运算符:,
指针运算符,*,&
求字节数运算符,sizeof
强制类型转换运算符:(类型)
分量运算符,.、- >
下标运算符,[ ]
自加、自减运算符:++、--
其它:如函数调用运算符()
第七章 运算符和表达式
7.2 表达式
由运算符加上运算对象就构成了表达式,C语言允许使用以下类型的表达式:
( 1)赋值表达式,如,a=5
( 2)算术表达式,如,3+ 4*2
( 3)关系表达式,如,5>6
( 4)逻辑表达式,如,3>5&&a>=b
( 5)条件表达式,如,a>b?a:b
( 6)逗号表达式,如,a=3,b=4,c=5
第七章 运算符和表达式
7.3 表达式的求值规则
C语言中的任何一个表达式都有一个确定的值,表达式的求值规则如下:
( 1)按运算符的优先级高低次序执行。
( 2)如果在一个运算对象(或称操作数)
两侧的运算符的优先级相同,则按 C语言规定的结合方向(结合性)进行。
第七章 运算符和表达式
优先级,是指在表达式中,运算符优先级较高的先于优先级较低的进行运算。
结合性,是指当一个操作数两侧的运算符具有相同的优先级时,该操作数是先与左边的运算符结合,还是先与右边的运算符结合。自左至右的结合方向,称为左结合性,反之称为右结合性。
单目运算符、条件运算符和赋值运算符是右结合性,其他运算符是左结合。
7.3 表达式的求值规则第七章 运算符和表达式
算术表达式中,运算对象可以是常量,
变量和函数等。
1.基本算术运算符基本算术运算符有如下 5种:
+ (加法 )、- (减法 ),*(乘法 ),/(除法 )、
%(求余数 )
7.4 算术表达式第七章 运算符和表达式
说明:
( 1)除法运算,/”,C语言规定:两个整数相除,
其商为整数,小数部分被舍弃。如果相除的两个数中至少有一个是实型的,则结果为实型。
( 2)求余数运算,%”:求余数运算要求两侧的操作数均为整型数据,否则出错。在 Turbo C
中,结果的符号与被除数的符号相同。
7.4 算术表达式第七章 运算符和表达式
2.算术表达式
所谓算术表达式,是指表达式中的运算符都是算术运算符。
在 C语言中,整型、实型和字符型数据间可以混合运算(因为字符数据与整型数据可以通用),如果一个运算符两侧的操作数的数据类型不同,则系统按,先转换,后运算,的原则,
首先将数据自动转换成同一类型,然后在同一类型数据间进行运算。
7.4 算术表达式第七章 运算符和表达式
7.4 算术表达式说明:
( 1)横向向左的箭头,表示必须的转换。
( 2)纵向向上的箭头,表示不同类型的转换方向。
第七章 运算符和表达式
注意:
箭头方向只表示数据类型级别的高低,
由低向高转换,不要理解为 int型先转成
unsigned型,再转成 long型,再转成
double型。如果一个 int型数据与一个
double型数据运算,是直接将 int型转成
double型。
7.4 算术表达式第七章 运算符和表达式
7.5 赋值表达式
1.赋值运算符,=
作用是将一个表达式的值赋给一个变量。
2.赋值表达式
由赋值运算符将一个变量和一个表达式连接起来就构成了赋值表达式,它的一般形式为:
变量 = 表达式
对赋值表达式求解的过程是:先求解赋值运算符右侧表达式的值,然后将值赋给左边的变量,
赋值表达式的值就是被赋值的变量的值。
第七章 运算符和表达式
例如:
x=5 /*将 5赋值给变量 x*/
y= (float)5/2 /*将表达式的值 (=2.5)赋值给变量 y*/
注意:被赋值的变量,必须是单个变量,且必须在赋值运算符的左边;赋值表达式又允许出现在其它赋值表达式当中。
7.5 赋值表达式第七章 运算符和表达式
当表达式值的类型与被赋值变量的类型不一致,但都是数值型或字符型时,系统会自动地将表达式的值转换成被赋值变量的数据类型,
然后再赋值给变量。具体规定如下:
( 1)实型赋予整型,舍去小数部分。
( 2)整型赋予实型,数值不变,但将以浮点形式存放。
( 3)字符型赋予整型,由于字符型为一个字节,而整型为二个字节,故将字符的 ASCII码值放到整型量的低八位中,高八位为 0。短整型赋给长整型时同理。
第七章 运算符和表达式
( 4)整型赋予字符型,只把低八位赋予字符量。长整型赋给短整型时同理。
( 5)双精度实型数据转换成单精度实型数据时,只保留单精度的有效位数。
( 6)除自动转换外,C语言也允许强制转换。
数据类型强制转换的一般格式为
(要转换成的数据类型 )(被转换的表达式 )
其中,当被转换的表达式是一个简单表达式时,外面的一对原括号可以省略。
7.5 赋值表达式第七章 运算符和表达式
例如:
(double)a /*将变量 a的值转换成 double型,
等价于 (double)(a)*/
(int)(x+ y) /*将 x+ y的结果转换成 int型 */
(float)5/2 /*将 5转换成实型,再除以
2(=2.5),等价于 (float)(5)/2*/
(float)(5/2) /*将 5整除 2的结果转换成实型
(2.0)*/
7.5 赋值表达式第七章 运算符和表达式
3.复合赋值运算复合赋值运算符是在赋值运算符之前再加一个双目运算符构成的。复合赋值运算的一般格式为:
变量 双目运算符 = 表达式等价:变量 =(变量 双目运算符 表达式 )。
当表达式为简单表达式时,表达式外的一对圆括号才可以省略,否则可能出错。
7.5 赋值表达式第七章 运算符和表达式
例如:
x+ =5 /*等价于 x=x+ 5*/
y*=x+ 3 /*等价于 y=y*(x+ 3),而不是 y=y*x+ 3*/
C语言规定的 10种复合赋值运算符如下:
+ =,- =,*=,/=,%=
/*复合算术运算符 (5个 )*/
~=,^=,|=,<<=,>>=
/*复合位运算符 (5个 )*/
7.5 赋值表达式第七章 运算符和表达式
[例 7.1]求以下算术表达式的值。
( 1) x+ a%3*(int)(x+ y)%2/4
设 x=2.5,a=7,y=4.7
( 2) (float)(a+ b)/2+ (int)x%(int)y
设 a=2,b=3,x=3.5,y=2.5
解:( 1) 2.500000
( 2) 3.500000
7.5 赋值表达式第七章 运算符和表达式
[例 7.2]求以下表达式的值,设 a=12。
( 1) a+ =a
( 2) a- =2
( 3) a*=2+ 3
( 4) a/=a+ a
( 5) a%=(n%=2),n的值等于 5
( 6) a+ =a- =a*=a
解:( 1) 24 ( 2) 10 ( 3) 60
( 4) 0 ( 5) 0 ( 6) 0
7.5 赋值表达式第七章 运算符和表达式
7.6 自加、自减表达式
1.运算符:++ (自加 )、--(自减)
自加运算使单个变量的值增 1,自减运算使单个变量的值减 1。
2.自加、自减表达式根据变量与运算符的位置不同,自加、自减表达式有以下四种情况:
++变量,--变量 (前置运算)
变量++,变量-- (后置运算)
( 1)前置运算 ——运算符放在变量之前,它先使变量的值增 (或减 )1,然后再以变化后的值参与运算,即先增减,后运算。
( 2)后置运算 ——运算符放在变量之后,它使变量先参与运算,然后再使变量的值增 (或减 )1,即先运算,
后增减。
第七章 运算符和表达式
[例 7.3]自增、自减运算符的用法与运算规则示例。
main()
{ int x=6,y;
printf("x=%d\n",x); /*输出 x的初值 */
y=++ x; /*前置运算,x先增 1(=7),然后再赋值给
y(=7)*/
printf("y=++ x,x=%d,y=%d\n",x,y);
y=x--;
printf("y=x--,x=%d,y=%d\n",x,y);
}
程序运行结果,x=6
y=++ x,x=7,y=7
y=x--,x=6,y=7
7.6 自加、自减表达式第七章 运算符和表达式说明:
( 1)自增、自减运算常用于循环语句以及指针变量中。它使循环控制变量加 (或减 )1,或使指针指向下 (或上 )一个数据的地址。
( 2)自增、自减运算符不能用于常量和表达式。例如,5++、-- (a+ b)等都是非法的。
( 3)在表达式中,同一变量连续进行自增自减运算时,很容易出错,所以最好避免这种用法。
如,表达式 d=(x++ )+ (x++ )+ (x++ )的值等于多少 (假设 x=3)?
7.6 自加、自减表达式第七章 运算符和表达式
7.7 逗号表达式逗号表达式的一般形式如下:
表达式 1,表达式 2,……,表达式 n
其求解过程是自左至右,依次计算各表达式的值,最右边,表达式 n”的值即为整个逗号表达式的值。
如:求解逗号表达式,a =3*5,a*4”的值:
先求解 a =3*5,得 a=15;再求解 a*4=60,所以,逗号表达式的值为 60。
第七章 运算符和表达式
注意:并不是任何地方出现的逗号,都是逗号运算符,很多情况下,逗号仅用作分隔符。
如,printf("%d,%d,%d",a,b,c);
,a,b,c”并不是一个逗号表达式,它是 printf
函数的三个参数,参数间用逗号间隔。
如果改写为:
printf("%d,%d,%d",(a,b,c),b,c);
则,(a,b,c)”是一个逗号表达式,它的值等于 c
的值,括号内作为一个表达式,括号内的逗号不是参数间的分隔符,而是逗号运算符。
7.7 逗号表达式第七章 运算符和表达式
7.8关系表达式关系表达式用来实现两个运算对象之间的大小关系的比较。
1.关系运算符
<(小于 ),<=(小于或等于 ),>(大于 )、
>=(大于或等于 ),==(等于 ),!=(不等于 )
关于优先级次序:
( 1)其中,前四个优先级别相同,后两个优先级别相同,前四个优先级高于后两个。
( 2)关系运算符的优先级低于算术运算符。
( 3)关系运算符的优先级高于赋值运算符。
第七章 运算符和表达式
2.关系表达式用关系运算符将两个表达式(连接起来的式子,称为关系表达式。
如,a>b,a+ b>b+ c,(a=3>(b=5)),a'<'b',(a>b)>(b>c)
关系表达式的值是逻辑值,真,或
,假,,C语言中以,非零,代表,真,,
以,0”代表,假,。在关系表达式求解时,
以,1”代表,真,,以,0”代表,假,。
当关系表达式成立时,表达式的值为 1,
否则,表达式的值为 0。
7.8关系表达式第七章 运算符和表达式如:关系表达式,5==3”的值为 0,
关系表达式,5>=0”的值为 1。
如,a=3,b=2,c=1,则:
a>b的值为,真,,表达式的值为 1
(a>b)==c的值为,真,,表达式的值为 1
b+ c<a的值为,假,,表达式的值为 0
7.8关系表达式第七章 运算符和表达式
7.9 逻辑表达式
1.逻辑运算符
&&(逻辑与 ),||(逻辑或 ),!(逻辑非 )
“&&”和,||”是,双目运算符,,它们要求有两个运算对象(操作数)。
如,(a>b)&&(x>y),(a>b)||(x>y)。
,!”是单目运算符,只要求有一个运算对象。
如 !(a>b)。
第七章 运算符和表达式
7.9 逻辑表达式高低
!(非)
算术运算符关系运算符
&&
||
赋值运算符逻辑运算符的优先级:
逻辑运算符的运算规则如下:
a&&b:仅当 a,b同时为真时,a&&b为真,其它情况
a&&b为假
a||b:仅当 a,b同时为假时,
a||b为假,其它情况 a||b为真
!a:若 a为真,!a为假;若
a为假,!a为真第七章 运算符和表达式
2.逻辑表达式用逻辑运算符将关系表达式或逻辑量连接起来就是逻辑表达式,其的值是一个逻辑量,真,或,假,。
在判断一个量是否为,真,时,以 0代表,假,,以非
0代表,真,,即将一个非零的数值认作为,真,,
如:( 1)若 a=4,则 !a的值为 0,因为 a的值为非 0,
被认作,真,,对它进行,非,运算,得,假,,
,假,以 0代表。
( 2)若 a=4,b=5,则 a&&b的值为 1,因为 a和 b均为非
0,被认为是,真,,因此 a&&b的值也为,真,,值为 1。
7.9 逻辑表达式第七章 运算符和表达式
在逻辑表达式的求解中,并不是所有的逻辑运算符都被执行,只是在必须执行下一个逻辑运算符才能求出表达式的解时,才执行该运算符。
如:
( 1) a&&b&&c只有 a为真(非 0)时,才需要求 b的值以及判别 b的值,只有 a和 b都为真的情况下才需要求 c的值以及判别 c的值。只要 a为假,就不必求解和判别 b和 c(此时整个表达式已确定为假)。如果 a为真,b为假,也不需判别 c。
( 2) a||b||c只要 a为真(非 0),就不必判断 b和 c;
只有 a为假,才判别 b; a和 b都为假才判别 c。
7.9 逻辑表达式第七章 运算符和表达式
7.10 条件表达式条件表达式的一般形式为:
表达式 1?表达式 2:表达式 3
表达式
1
条件表达式取表达式 2的值条件表达式取表达式 3的值它的执行过程:
第七章 运算符和表达式
说明:
( 1)条件运算符的执行顺序:先求解表达式 1,
若为非 0,则求解表达式 2,此时表达式 2的值就作为整个条件表达式的值。若表达式 1的值为 0,则求解表达式 3,表达式 3的值就是整个条件表达式的值。
如,max=(a>b)?a:b
执行结果就是将条件表达式的值赋给 max,
也就是将 a和 b二者中的大者赋给 max。
7.10 条件表达式第七章 运算符和表达式
( 2)条件运算符仅优先于赋值运算符,因此上面赋值表达式的求解过程是先求解条件表达式,再将它的值赋给 max。
7.10 条件表达式第七章 运算符和表达式
7.11 位运算
所谓位运算是指进行二进制位的运算。
1.位运算符
C语言提供了 6种位运算符:
位运算符 功 能
& 按位与
| 按位或
^ 按位异或
~ 取反
<< 左移
>> 右移第七章 运算符和表达式
2.位运算符功能实现
( 1),按位与,运算按位与运算符,&”是双目运算符,其功能是参与运算的两数各对应的二进制位相,与,。
只有对应的两个二进制位均为 1时,结果位才为 1,否则为 0。参与运算的数以补码方式出现。
7.11 位运算如,9&5可写算式如下:
00001001 ( 9的二进制补码)
00000101 ( 5的二进制补码)
00000001 ( 1的二进制补码)&9&5=1。
第七章 运算符和表达式
[例 7.4]“按位与”运算示例
main( )
{ int a=9,b=5,c;
c=a&b;
printf("a=%d\nb=%d\nc=%d\n",a,b,c);
}
程序运行结果:
a=9
b=5
c=1
7.11 位运算第七章 运算符和表达式
( 2),按位或,运算按位或运算符,|”是双目运算符,其功能是参与运算的两数对应的二进制位相,或,。
只要对应的两个二进制位有一个为 1时,结果位就为 1。参与运算的两个数均以补码方式出现。
7.11 位运算如,9|5可写算式如下:
00001001 ( 9的二进制补码)
00000101 ( 5的二进制补码)
00001101 ( 13的二进制补码)
|
9|5=13
第七章 运算符和表达式
[例 7.5]“按位或”运算示例
main( )
{ int a=9,b=5,c;
c=a|b;
printf("a=%d\nb=%d\nc=%d\n",a,b,c);
}
程序运行结果:
a=9
b=5
c=13
7.11 位运算第七章 运算符和表达式
( 3),按位异或,运算按位异或运算符,^”是双目运算符,其功能是参与运算的两数各对应的二进制位相异或。
当两个对应的二进制位相异时,结果为 1。参与运算数级以补码方式出现。
如,9^5可写成算式如下:
00001001 ( 9的二进制补码)
00000101 ( 5的二进制补码)
00001100 ( 12的二进制补码)
^
7.11 位运算第七章 运算符和表达式
[例 7.6]“按位异或”运算示例
main( )
{ int a=9;
a=a^5;
printf("a=%d\n",a);
}
程序运行结果,a=12
7.11 位运算第七章 运算符和表达式
( 4),按位求反,运算求反运算符,~”为单目运算符,具有右结合性,其功能是对参与运算的数的各二进制位按位求反。
如,~ 9的运算:
~ (0000000000001001)
结果为,1111111111110110
7.11 位运算第七章 运算符和表达式
( 5)左移运算左移运算符,<<”是双目运算符,其功能是把,<<”左边的运算数的各二进制位全部左移,
由,<<”右边的数指定移动的位数。其中,移位过程中,高位丢弃,低位补 0。
如:取 a=3,a<<4的运算:
是指把 a的各二进制位向左移动 4位。就是将
00000011(十进制 3),左移 4位后为
00110000(十进制 48)。
7.11 位运算第七章 运算符和表达式
( 6)右移运算右移运算符,>>”是双目运算符,其功能是把,>>”左边的运算数的各二进制位全部右移,,>>”右边的数指定移动的位数。移动过程中,低位丢弃。
如:取 a=15,则 a>>2
表示把 000001111右移为 00000011(十进制 3)。
注意,对于有符号数,在右移时,符号位将随同移动。
当为正数时,最高位补 0,而为负数时,符号位为 1,
最高位是补 0或是补 1 取决于编译系统的规定。 Turbo
C和很多系统规定为补 1。
7.11 位运算第七章 运算符和表达式
[例 7.7]“右移”运算示例
main( )
{ unsigned a,b;
printf("input a number:");
scanf("%d",&a);
b=a>>5;
printf("a=%d\nb=%d\n",a,b);
}
程序运行情况:
input a number:100↙
a=100
b=3
7.11 位运算第七章 运算符和表达式
7.11 位运算
7.1 运算符
算术运算符,+、-,*,/,%
关系运算符,>,<,==,>=,<=、! =
逻辑运算符:!,&&,||
位运算符,<<,>>,~,|,^,&
赋值运算符,=及其扩展赋值运算符
条件运算符:?:
逗号运算符:,
指针运算符,*,&
求字节数运算符,sizeof
强制类型转换运算符:(类型)
分量运算符,.、- >
下标运算符,[ ]
自加、自减运算符:++、--
其它:如函数调用运算符()
第七章 运算符和表达式
7.2 表达式
由运算符加上运算对象就构成了表达式,C语言允许使用以下类型的表达式:
( 1)赋值表达式,如,a=5
( 2)算术表达式,如,3+ 4*2
( 3)关系表达式,如,5>6
( 4)逻辑表达式,如,3>5&&a>=b
( 5)条件表达式,如,a>b?a:b
( 6)逗号表达式,如,a=3,b=4,c=5
第七章 运算符和表达式
7.3 表达式的求值规则
C语言中的任何一个表达式都有一个确定的值,表达式的求值规则如下:
( 1)按运算符的优先级高低次序执行。
( 2)如果在一个运算对象(或称操作数)
两侧的运算符的优先级相同,则按 C语言规定的结合方向(结合性)进行。
第七章 运算符和表达式
优先级,是指在表达式中,运算符优先级较高的先于优先级较低的进行运算。
结合性,是指当一个操作数两侧的运算符具有相同的优先级时,该操作数是先与左边的运算符结合,还是先与右边的运算符结合。自左至右的结合方向,称为左结合性,反之称为右结合性。
单目运算符、条件运算符和赋值运算符是右结合性,其他运算符是左结合。
7.3 表达式的求值规则第七章 运算符和表达式
算术表达式中,运算对象可以是常量,
变量和函数等。
1.基本算术运算符基本算术运算符有如下 5种:
+ (加法 )、- (减法 ),*(乘法 ),/(除法 )、
%(求余数 )
7.4 算术表达式第七章 运算符和表达式
说明:
( 1)除法运算,/”,C语言规定:两个整数相除,
其商为整数,小数部分被舍弃。如果相除的两个数中至少有一个是实型的,则结果为实型。
( 2)求余数运算,%”:求余数运算要求两侧的操作数均为整型数据,否则出错。在 Turbo C
中,结果的符号与被除数的符号相同。
7.4 算术表达式第七章 运算符和表达式
2.算术表达式
所谓算术表达式,是指表达式中的运算符都是算术运算符。
在 C语言中,整型、实型和字符型数据间可以混合运算(因为字符数据与整型数据可以通用),如果一个运算符两侧的操作数的数据类型不同,则系统按,先转换,后运算,的原则,
首先将数据自动转换成同一类型,然后在同一类型数据间进行运算。
7.4 算术表达式第七章 运算符和表达式
7.4 算术表达式说明:
( 1)横向向左的箭头,表示必须的转换。
( 2)纵向向上的箭头,表示不同类型的转换方向。
第七章 运算符和表达式
注意:
箭头方向只表示数据类型级别的高低,
由低向高转换,不要理解为 int型先转成
unsigned型,再转成 long型,再转成
double型。如果一个 int型数据与一个
double型数据运算,是直接将 int型转成
double型。
7.4 算术表达式第七章 运算符和表达式
7.5 赋值表达式
1.赋值运算符,=
作用是将一个表达式的值赋给一个变量。
2.赋值表达式
由赋值运算符将一个变量和一个表达式连接起来就构成了赋值表达式,它的一般形式为:
变量 = 表达式
对赋值表达式求解的过程是:先求解赋值运算符右侧表达式的值,然后将值赋给左边的变量,
赋值表达式的值就是被赋值的变量的值。
第七章 运算符和表达式
例如:
x=5 /*将 5赋值给变量 x*/
y= (float)5/2 /*将表达式的值 (=2.5)赋值给变量 y*/
注意:被赋值的变量,必须是单个变量,且必须在赋值运算符的左边;赋值表达式又允许出现在其它赋值表达式当中。
7.5 赋值表达式第七章 运算符和表达式
当表达式值的类型与被赋值变量的类型不一致,但都是数值型或字符型时,系统会自动地将表达式的值转换成被赋值变量的数据类型,
然后再赋值给变量。具体规定如下:
( 1)实型赋予整型,舍去小数部分。
( 2)整型赋予实型,数值不变,但将以浮点形式存放。
( 3)字符型赋予整型,由于字符型为一个字节,而整型为二个字节,故将字符的 ASCII码值放到整型量的低八位中,高八位为 0。短整型赋给长整型时同理。
第七章 运算符和表达式
( 4)整型赋予字符型,只把低八位赋予字符量。长整型赋给短整型时同理。
( 5)双精度实型数据转换成单精度实型数据时,只保留单精度的有效位数。
( 6)除自动转换外,C语言也允许强制转换。
数据类型强制转换的一般格式为
(要转换成的数据类型 )(被转换的表达式 )
其中,当被转换的表达式是一个简单表达式时,外面的一对原括号可以省略。
7.5 赋值表达式第七章 运算符和表达式
例如:
(double)a /*将变量 a的值转换成 double型,
等价于 (double)(a)*/
(int)(x+ y) /*将 x+ y的结果转换成 int型 */
(float)5/2 /*将 5转换成实型,再除以
2(=2.5),等价于 (float)(5)/2*/
(float)(5/2) /*将 5整除 2的结果转换成实型
(2.0)*/
7.5 赋值表达式第七章 运算符和表达式
3.复合赋值运算复合赋值运算符是在赋值运算符之前再加一个双目运算符构成的。复合赋值运算的一般格式为:
变量 双目运算符 = 表达式等价:变量 =(变量 双目运算符 表达式 )。
当表达式为简单表达式时,表达式外的一对圆括号才可以省略,否则可能出错。
7.5 赋值表达式第七章 运算符和表达式
例如:
x+ =5 /*等价于 x=x+ 5*/
y*=x+ 3 /*等价于 y=y*(x+ 3),而不是 y=y*x+ 3*/
C语言规定的 10种复合赋值运算符如下:
+ =,- =,*=,/=,%=
/*复合算术运算符 (5个 )*/
~=,^=,|=,<<=,>>=
/*复合位运算符 (5个 )*/
7.5 赋值表达式第七章 运算符和表达式
[例 7.1]求以下算术表达式的值。
( 1) x+ a%3*(int)(x+ y)%2/4
设 x=2.5,a=7,y=4.7
( 2) (float)(a+ b)/2+ (int)x%(int)y
设 a=2,b=3,x=3.5,y=2.5
解:( 1) 2.500000
( 2) 3.500000
7.5 赋值表达式第七章 运算符和表达式
[例 7.2]求以下表达式的值,设 a=12。
( 1) a+ =a
( 2) a- =2
( 3) a*=2+ 3
( 4) a/=a+ a
( 5) a%=(n%=2),n的值等于 5
( 6) a+ =a- =a*=a
解:( 1) 24 ( 2) 10 ( 3) 60
( 4) 0 ( 5) 0 ( 6) 0
7.5 赋值表达式第七章 运算符和表达式
7.6 自加、自减表达式
1.运算符:++ (自加 )、--(自减)
自加运算使单个变量的值增 1,自减运算使单个变量的值减 1。
2.自加、自减表达式根据变量与运算符的位置不同,自加、自减表达式有以下四种情况:
++变量,--变量 (前置运算)
变量++,变量-- (后置运算)
( 1)前置运算 ——运算符放在变量之前,它先使变量的值增 (或减 )1,然后再以变化后的值参与运算,即先增减,后运算。
( 2)后置运算 ——运算符放在变量之后,它使变量先参与运算,然后再使变量的值增 (或减 )1,即先运算,
后增减。
第七章 运算符和表达式
[例 7.3]自增、自减运算符的用法与运算规则示例。
main()
{ int x=6,y;
printf("x=%d\n",x); /*输出 x的初值 */
y=++ x; /*前置运算,x先增 1(=7),然后再赋值给
y(=7)*/
printf("y=++ x,x=%d,y=%d\n",x,y);
y=x--;
printf("y=x--,x=%d,y=%d\n",x,y);
}
程序运行结果,x=6
y=++ x,x=7,y=7
y=x--,x=6,y=7
7.6 自加、自减表达式第七章 运算符和表达式说明:
( 1)自增、自减运算常用于循环语句以及指针变量中。它使循环控制变量加 (或减 )1,或使指针指向下 (或上 )一个数据的地址。
( 2)自增、自减运算符不能用于常量和表达式。例如,5++、-- (a+ b)等都是非法的。
( 3)在表达式中,同一变量连续进行自增自减运算时,很容易出错,所以最好避免这种用法。
如,表达式 d=(x++ )+ (x++ )+ (x++ )的值等于多少 (假设 x=3)?
7.6 自加、自减表达式第七章 运算符和表达式
7.7 逗号表达式逗号表达式的一般形式如下:
表达式 1,表达式 2,……,表达式 n
其求解过程是自左至右,依次计算各表达式的值,最右边,表达式 n”的值即为整个逗号表达式的值。
如:求解逗号表达式,a =3*5,a*4”的值:
先求解 a =3*5,得 a=15;再求解 a*4=60,所以,逗号表达式的值为 60。
第七章 运算符和表达式
注意:并不是任何地方出现的逗号,都是逗号运算符,很多情况下,逗号仅用作分隔符。
如,printf("%d,%d,%d",a,b,c);
,a,b,c”并不是一个逗号表达式,它是 printf
函数的三个参数,参数间用逗号间隔。
如果改写为:
printf("%d,%d,%d",(a,b,c),b,c);
则,(a,b,c)”是一个逗号表达式,它的值等于 c
的值,括号内作为一个表达式,括号内的逗号不是参数间的分隔符,而是逗号运算符。
7.7 逗号表达式第七章 运算符和表达式
7.8关系表达式关系表达式用来实现两个运算对象之间的大小关系的比较。
1.关系运算符
<(小于 ),<=(小于或等于 ),>(大于 )、
>=(大于或等于 ),==(等于 ),!=(不等于 )
关于优先级次序:
( 1)其中,前四个优先级别相同,后两个优先级别相同,前四个优先级高于后两个。
( 2)关系运算符的优先级低于算术运算符。
( 3)关系运算符的优先级高于赋值运算符。
第七章 运算符和表达式
2.关系表达式用关系运算符将两个表达式(连接起来的式子,称为关系表达式。
如,a>b,a+ b>b+ c,(a=3>(b=5)),a'<'b',(a>b)>(b>c)
关系表达式的值是逻辑值,真,或
,假,,C语言中以,非零,代表,真,,
以,0”代表,假,。在关系表达式求解时,
以,1”代表,真,,以,0”代表,假,。
当关系表达式成立时,表达式的值为 1,
否则,表达式的值为 0。
7.8关系表达式第七章 运算符和表达式如:关系表达式,5==3”的值为 0,
关系表达式,5>=0”的值为 1。
如,a=3,b=2,c=1,则:
a>b的值为,真,,表达式的值为 1
(a>b)==c的值为,真,,表达式的值为 1
b+ c<a的值为,假,,表达式的值为 0
7.8关系表达式第七章 运算符和表达式
7.9 逻辑表达式
1.逻辑运算符
&&(逻辑与 ),||(逻辑或 ),!(逻辑非 )
“&&”和,||”是,双目运算符,,它们要求有两个运算对象(操作数)。
如,(a>b)&&(x>y),(a>b)||(x>y)。
,!”是单目运算符,只要求有一个运算对象。
如 !(a>b)。
第七章 运算符和表达式
7.9 逻辑表达式高低
!(非)
算术运算符关系运算符
&&
||
赋值运算符逻辑运算符的优先级:
逻辑运算符的运算规则如下:
a&&b:仅当 a,b同时为真时,a&&b为真,其它情况
a&&b为假
a||b:仅当 a,b同时为假时,
a||b为假,其它情况 a||b为真
!a:若 a为真,!a为假;若
a为假,!a为真第七章 运算符和表达式
2.逻辑表达式用逻辑运算符将关系表达式或逻辑量连接起来就是逻辑表达式,其的值是一个逻辑量,真,或,假,。
在判断一个量是否为,真,时,以 0代表,假,,以非
0代表,真,,即将一个非零的数值认作为,真,,
如:( 1)若 a=4,则 !a的值为 0,因为 a的值为非 0,
被认作,真,,对它进行,非,运算,得,假,,
,假,以 0代表。
( 2)若 a=4,b=5,则 a&&b的值为 1,因为 a和 b均为非
0,被认为是,真,,因此 a&&b的值也为,真,,值为 1。
7.9 逻辑表达式第七章 运算符和表达式
在逻辑表达式的求解中,并不是所有的逻辑运算符都被执行,只是在必须执行下一个逻辑运算符才能求出表达式的解时,才执行该运算符。
如:
( 1) a&&b&&c只有 a为真(非 0)时,才需要求 b的值以及判别 b的值,只有 a和 b都为真的情况下才需要求 c的值以及判别 c的值。只要 a为假,就不必求解和判别 b和 c(此时整个表达式已确定为假)。如果 a为真,b为假,也不需判别 c。
( 2) a||b||c只要 a为真(非 0),就不必判断 b和 c;
只有 a为假,才判别 b; a和 b都为假才判别 c。
7.9 逻辑表达式第七章 运算符和表达式
7.10 条件表达式条件表达式的一般形式为:
表达式 1?表达式 2:表达式 3
表达式
1
条件表达式取表达式 2的值条件表达式取表达式 3的值它的执行过程:
第七章 运算符和表达式
说明:
( 1)条件运算符的执行顺序:先求解表达式 1,
若为非 0,则求解表达式 2,此时表达式 2的值就作为整个条件表达式的值。若表达式 1的值为 0,则求解表达式 3,表达式 3的值就是整个条件表达式的值。
如,max=(a>b)?a:b
执行结果就是将条件表达式的值赋给 max,
也就是将 a和 b二者中的大者赋给 max。
7.10 条件表达式第七章 运算符和表达式
( 2)条件运算符仅优先于赋值运算符,因此上面赋值表达式的求解过程是先求解条件表达式,再将它的值赋给 max。
7.10 条件表达式第七章 运算符和表达式
7.11 位运算
所谓位运算是指进行二进制位的运算。
1.位运算符
C语言提供了 6种位运算符:
位运算符 功 能
& 按位与
| 按位或
^ 按位异或
~ 取反
<< 左移
>> 右移第七章 运算符和表达式
2.位运算符功能实现
( 1),按位与,运算按位与运算符,&”是双目运算符,其功能是参与运算的两数各对应的二进制位相,与,。
只有对应的两个二进制位均为 1时,结果位才为 1,否则为 0。参与运算的数以补码方式出现。
7.11 位运算如,9&5可写算式如下:
00001001 ( 9的二进制补码)
00000101 ( 5的二进制补码)
00000001 ( 1的二进制补码)&9&5=1。
第七章 运算符和表达式
[例 7.4]“按位与”运算示例
main( )
{ int a=9,b=5,c;
c=a&b;
printf("a=%d\nb=%d\nc=%d\n",a,b,c);
}
程序运行结果:
a=9
b=5
c=1
7.11 位运算第七章 运算符和表达式
( 2),按位或,运算按位或运算符,|”是双目运算符,其功能是参与运算的两数对应的二进制位相,或,。
只要对应的两个二进制位有一个为 1时,结果位就为 1。参与运算的两个数均以补码方式出现。
7.11 位运算如,9|5可写算式如下:
00001001 ( 9的二进制补码)
00000101 ( 5的二进制补码)
00001101 ( 13的二进制补码)
|
9|5=13
第七章 运算符和表达式
[例 7.5]“按位或”运算示例
main( )
{ int a=9,b=5,c;
c=a|b;
printf("a=%d\nb=%d\nc=%d\n",a,b,c);
}
程序运行结果:
a=9
b=5
c=13
7.11 位运算第七章 运算符和表达式
( 3),按位异或,运算按位异或运算符,^”是双目运算符,其功能是参与运算的两数各对应的二进制位相异或。
当两个对应的二进制位相异时,结果为 1。参与运算数级以补码方式出现。
如,9^5可写成算式如下:
00001001 ( 9的二进制补码)
00000101 ( 5的二进制补码)
00001100 ( 12的二进制补码)
^
7.11 位运算第七章 运算符和表达式
[例 7.6]“按位异或”运算示例
main( )
{ int a=9;
a=a^5;
printf("a=%d\n",a);
}
程序运行结果,a=12
7.11 位运算第七章 运算符和表达式
( 4),按位求反,运算求反运算符,~”为单目运算符,具有右结合性,其功能是对参与运算的数的各二进制位按位求反。
如,~ 9的运算:
~ (0000000000001001)
结果为,1111111111110110
7.11 位运算第七章 运算符和表达式
( 5)左移运算左移运算符,<<”是双目运算符,其功能是把,<<”左边的运算数的各二进制位全部左移,
由,<<”右边的数指定移动的位数。其中,移位过程中,高位丢弃,低位补 0。
如:取 a=3,a<<4的运算:
是指把 a的各二进制位向左移动 4位。就是将
00000011(十进制 3),左移 4位后为
00110000(十进制 48)。
7.11 位运算第七章 运算符和表达式
( 6)右移运算右移运算符,>>”是双目运算符,其功能是把,>>”左边的运算数的各二进制位全部右移,,>>”右边的数指定移动的位数。移动过程中,低位丢弃。
如:取 a=15,则 a>>2
表示把 000001111右移为 00000011(十进制 3)。
注意,对于有符号数,在右移时,符号位将随同移动。
当为正数时,最高位补 0,而为负数时,符号位为 1,
最高位是补 0或是补 1 取决于编译系统的规定。 Turbo
C和很多系统规定为补 1。
7.11 位运算第七章 运算符和表达式
[例 7.7]“右移”运算示例
main( )
{ unsigned a,b;
printf("input a number:");
scanf("%d",&a);
b=a>>5;
printf("a=%d\nb=%d\n",a,b);
}
程序运行情况:
input a number:100↙
a=100
b=3
7.11 位运算第七章 运算符和表达式
7.11 位运算