第三章 运算符和表达式
C
运算符算术运算符:( + - * / % ++ --)
关系运算符:( < <= == > >= !=)
逻辑运算符:((! && ||)
位运算符,( << >> ~ | ^ &)
赋值运算符:( = 及其扩展)
条件运算符:(?:)
逗号运算符:(,)
指针运算符:( * &)
求字节数,( sizeof)
强制类型转换:(类型)
分量运算符:(,->)
下标运算符:( [])
其它,( ( ) -)
< >
语言程序设计第三章运算符和表达式
C
学习运算符应注意:
运算符功能
与运算量关系
要求运算量个数
要求运算量类型
运算符优先级别
结合方向
结果的类型
< >
语言程序设计第三章运算符和表达式
C
3.1 算术运算
3.2 赋值运算
3.3 自增、自减运算
3.4 关系运算与逻辑运算
3.5 条件运算
3.6 逗号运算
3.7 位运算
3.8 类型转换
3.1 算术运算
3.1.1 算术运算符
基本算术运算符,+ - * / %
结合方向:从左向右
优先级,- ---->* / % -----> + -
(2) (3) (4)
说明:
,-” 可为 单目 运算符时,右结合性
两整数相除,结果为整数
%要求两侧均为整型数据例 5/2 =
-5/2.0 =
例 5%2 =
-5%2 =
1%10 =
5%1 =
5.5%2
例 5/2 2
-5/2.0 = -2.5
例 1
- -1
1
0
(?)
语言程序设计第三章运算符和表达式
C
3.1.2 算术表达式及其书写特点
算术表达式是用算术运算符,圆括号将运算对象连接起来的符合 C语言的语法规则的式子 。 其中,运算对象可以是常量,变量,表达式,函数等等 。
书写时注意以下几点:
① C表达式中的乘号不能省略 。
例如:数学式 b2-4ac 相应的 C表达式应写成,b*b-4*a*c
② C表达式中只能使用系统允许的标识符 。
例如:数学式 πr2 相应的 C表达式应写成,3.14159*r*r
③ C表达式中的内容必须书写在同一行,不允许有分子分母形式,必要时要利用圆括号保证运算的顺序 。
例如,c+d相应的 C表达式应写成,(a+b)/(c+d)
④ C表达式不允许使用方括号和花括号,只能使用圆括号来帮助限定运算顺序 。 可以使用多层圆括号,但左右括号必须配对,
运算时从内层圆括号开始,由内向外依次计算表达式的值 。
语言程序设计第三章运算符和表达式
C
3.2 赋值运算
3.2.1--3.2.2 赋值运算符、赋值表达式
简单赋值运算符,=
赋值表达式
格式,变量标识符 =表达式
作用:将赋值号右边的表达式计算出来,将其值赋给左边的一个变量。
复合赋值运算符
种类,+= -= *= /= %=,=,= &= ^= |=
含义,exp1 op= exp2? exp1 = exp1 op exp2
a+=3 a=a+3
x*=y+8 x=x*(y+8)
x%=3 x=x%3
例 a=3;
d=func();
c=d+2;
语言程序设计第三章运算符和表达式
C
3.2.3 赋值运算符的优先级和结合性
优先级,14
结合方向,自右向左
左侧必须是变量,不能是常量或表达式每个表达式都有一个值(当然每个值都有所属的类型):
赋值表达式的值与变量值相等,且可嵌套
赋值转换 规则,使赋值号右边表达式值 自动 转换成其左边变量的类型例 3=x-2*y;
a+b=3;
例 float f;
int i;
i=10;
f=i;
则 f=10.0
例 int i;
i=2.56; //结果 i=2;
例,a=b=c=5
a=(b=5)
a=5+(c=6)
a=(b=4)+(c=6)
a=(b=10)/(c=2)
< >
//表达式值为 5,a,b,c值为 5
// b=5;a=5
//表达式值 11,c=6,a=11
//表达式值 10,a=10,b=4,c=6
//表达式值 5,a=5,b=10,c=2
语言程序设计第三章运算符和表达式
C
例,a=12;
a+=a-=a*a
例,int a=2;
a%=4-1;
a+=a*=a-=a*=3;
< >
//a=-264 等价于 a=a+(a=a-(a*a))
//a=0 等价于 a=a+(a=a*(a=a-(a=a*3)))
语言程序设计第三章运算符和表达式
C
不同类型数据间的转换
隐式转换
什么情况下发生
运算转换 ------不同类型数据混合运算时
赋值转换 ------把一个值赋给与其类型不同的变量时
输出转换 ------输出时转换成指定的输出格式
函数调用转换 ------实参与形参类型不一致时转换
运算转换规则,不同类型数据运算时先 自动 转换成同一类型
< >
语言程序设计第二章数据描述
C
double float
long
unsigned
int char,short低高 说明,
必定的转换运算对象类型不同时转换例 char ch;
int i;
float f;
double d;
ch/i + f*d - (f+i)
int
int
double
double
double
double
double
double
int
int
double
double
double
double
double
double
10+?a? +i*f - d/l
例 int i;
float f;
double d;
long l;
< >
显式转换(强制转换)
一般形式,( 类型名 ) ( 表达式)
例 (int)(x+y)
(int)x+y
(double)(3/2)
(int)3.6
说明:强制转换得到所需类型的中间变量,原变量类型不变例 main()
{ float x;
int i;
x=3.6;
i=(int)x;
printf(“x=%f,i=%d”,x,i);
}
结果,x=3.600000,i=3
精度损失问题较高类型向较低类型转换时可能发生
< >
语言程序设计第二章数据描述
C
3.3 自增、自减运算
3.3.1--- 3.3.2 自增、自减运算符、表达式、结合性、优先级
作用:使变量值加 1或减 1
种类:
前置 ++i,--i (先执行 i+1或 i-1,再使用 i值)
后置 i++,i-- (先使用 i值,再执行 i+1或 i-1)
例 j=3; k=++j;等价于,j++;k=j;
j=3; k=j++;等价于,k=j;j++;
j=3; printf(“%d”,++j);
j=3; printf(“%d”,j++);
a=3;b=5;c=(++a)*b;
a=3;b=5;c=(a++)*b;
< >
//k=4,j=4
//k=3,j=4
//4
//3
//c=20,a=4
//c=15,a=4
语言程序设计第三章运算符和表达式
C
每个表达式都有一个值(当然每个值都有所属的类型):
… (i++)… 中表达式 (i++)的值是变量 i在 ++之前的值;
但 i++的值已经增 1;
… (++i)… 中表达式 (++i)的值是变量 i在 ++之后的值;
++ -- 不能用于常量和表达式,如 5++,(a+b)++
++ --结合方向,自右向左
优先级,- ++ -- ------>* / % ----->+ -
(2) (3) (4)
例 -i++? -(i++)
i=3; printf(“%d”,-i++); //-3例 j+++k; (j++)+k;例 -i++i=3; printf(“%d”,-i++);
语言程序设计第三章运算符和表达式
C
3.3.3 使用自增、自减运算符的注意事项
② 对于形如 a+++b的表达式,C语言的编译系统在处理时尽可能多的自左至右将若干个字符结合成一个运算符 。 因此,a+++b被理解为 (a++)+b,而不是 a+(++b)。 为避免产生误解,建议将此表达式写成 (a++)+b的形式 。
例如,x=i+++i+++i++;应被理解为 z=(i++)+(i++)+(i++);
自增,自减运算符使得 C的表达式灵活,简洁,但有时候会使初学者迷惑,若使用不当,会产生意外的后果 。 这就需要在使用时尤其注意 。
① 当一个表达式中,含有若干个子表达式时,ANSI C没有规定运算符和运算对象的计算次序,因此不同编译系统处理的顺序可能不同 。
例如,x=a*b+c%d 无所谓;
例如,a=3;y=a*++a;不同的编译系统有两种处理方式,结果不同:
A) 按从左到右的顺序处理为:先取 a的值 3,再计算 ++a,a的值 自增为 4,
子表达式 ++a的值也为 4,所以相乘的结果为 12;
B) 按从右到左的顺序处理为:先计算 ++a,a的值自增为 4,子表达式 ++a的值也为 4,再取 a的值为 4,所以相乘的结果为 16。
③ 在一个表达式中,出现对同一个变量的多次自增、自减运算时,有的编译系统按从左到右的次序处理,而有些系统一次性的处理这些运算是从右到左(如 TURBO C 2.0系统)。
请看下列程序的输出结果。
main( )
{
int i=6,k=6,a,b;
a=(i++)+(i++)+(i++);
b=(++k)+(++k)+(++k);
printf("\ni=%d,k=%d",i,k);
printf("\na=%d,b=%d",a,b);
}
若按从左到右的次序处理,预期的运行结果为:
i=9,k=9
a=21,b=24
TC 2.0 程序的运行结果如下:
i=9,k=9
a=18,b=27
④ 在调用函数时,对于实参的求值顺序,ANSI C也没有规定
。有的系统按从左到右的顺序求值,有的相同按从右到左的顺序求值。
例 3.2】
main( )
{
int i=5;
printf("\n%d,%d",i,++i);
}
若按从左到右的次序处理,预期的运行结果为:
5,6
TC 2.0 程序的运行结果如下:
6,6
⑤ 编写程序时,应注意把可读性放在第一位,避免编写晦涩难懂、容易引起误解的程序。尤其在使用自增、自减运算符时,尽量不要使用易于误解的表达方式。
为了清晰的表达编程者的意图,可以将一个复杂的语句分解成多个简单的语句。
例如,A) y=a*++a; 可改写为 b=++a;
y=a*b;
B) printf("\n%d,%d",i,++i);
可改写为 k=i;
printf("\n%d,%d",k,++i);
C) a=(i++)+(i++)+(i++);
可改写为,x=i++;
y=i++;
z=i++;
a=x+y+z;
关系运算符和关系表达式
关系运算符
种类,< <= == >= > !=
结合方向:自左向右
优先级别:
<
<=
>
>=
==
!=
优先级 6(高)
优先级 7(低)例 c>a+b //c>(a+b)
a>b!=c //(a>b)!=c
a==b<c //a==(b<c)
a=b>c //a=(b>c)
关系表达式的值:是逻辑值“真”或“假”,用 1和 0表示例 int a=3,b=2,c=1,d,f;
a>b
(a>b)==c
b+c<a
d=a>b
f=a>b>c
< >
//表达式值 1
//表达式值 1
//表达式值 0
//d=1
//f=0
语言程序设计第三章运算符和表达式
C
关系运算注意:
< >
例 若 a=0; b=0.5; x=0.3;
则 a<=x<=b的值为 0
例 5>2>7>8在 C中是允许的,
值为 0
例 int i=1,j=7,a;
a=i+(j%4!=0);
则 a= 2
例 ‘ a?>0 结果为
‘ A?>100 结果为
1
0
语言程序设计第二章数据描述
C
关系运算注意:
例 注意区分,=”与,==”
int a=0,b=1;
if(a=b)
printf(“a equal to b”);
else
printf(“a not equal to b”);
语言程序设计第二章数据描述
C
a b !a !b a&&b a||b
真假真假假假真真
逻辑运算符和表达式
逻辑运算符
种类,! && ||
逻辑运算真值表
C语言中,运算量,0表示,假,,
非 0表示,真,,
运算结果,0表示,假,,
1表示,真,,
< >
真假假假假假真真假假真真真假真真语言程序设计第二章数据描述
C
! (2)
&& (11)
|| (12)
高低例 a<=x && x<=b
a>b&&x>y
a==b||x==y
!a||a>b
优先级:
结合方向:
!,从右向左
&&,从左向右
||,从左向右
< >
// (a<=x) && (x<=b)
//(a>b)&&(x>y)
//(a==b)||(x==y)
//(!a)||(a>b)
语言程序设计第二章数据描述
C
! (2)
&& (11)
|| (12)
高低
优先级:
结合方向:
!,从右向左
&&,从左向右
||,从左向右例 a=4;b=5;
!a
a&&b
a||b
!a||b
4&&0||2
5>3&&2||8<4-!0
c?&&?d?
< >
值为 1
值为 0
值为 1
值为 1
值为 1
值为 1
//(5>3)&&2||(8<(4-(!0))) 值为 1
语言程序设计第二章数据描述
C
! (2)
&& (11)
|| (12)
高低
优先级:
结合方向:
!,从右向左
&&,从左向右
||,从左向右
短路特性,逻辑表达式求解时,并非所有的逻辑运算符都被执行,只是在必须执行下一个逻辑运算符才能求出表达式的解时,才执行该运算符
< >
例 a&&b&&c //只在 a为真时,才判别 b的值;
只在 a,b都为真时,才判别 c的值例 a||b||c //只在 a为假时,才判别 b的值;
只在 a,b都为假时,才判别 c的值例 a=1;b=2;c=3;d=4;m=1;n=1;
(m=a>b)&&(n=c>d)
//结果 m=0,n=1
语言程序设计第二章数据描述
C
条件运算符与表达式
一般形式,expr1? expr2,expr3
执行过程
功能:相当于条件语句,但不能取代一般 if语句例 if (a>b)
printf(“%d”,a);
else
printf(“%d”,b);
printf(“%d”,a>b?a:b);
例 求 a+|b|
printf(“a+|b|=%d\n”,b>0?a+b:a-b);
expr1
取 expr2值 取 expr3值非 0 =0
例 (a==b)Y?:?N?
(x%2==1)?1:0
(x>=0)?x:-x
(c>=?a? && c<=?z?)?c-?a?+?A?:c
条件运算符可嵌套如 x>0?1:(x<0?-1:0)
优先级,13
结合方向,自右向左如 a>b?a:c>d?c:d? a>b?a:(c>d?c:d)
expr1,expr2,expr3类型可不同,表达式值取较高的类型
< >
例 xa?:?b? //x=0,表达式值为‘ b?; x?0,表达式值为‘ a?
x>y?1:1.5 //x>y,值为 1.0; x<y,值为 1.5
语言程序设计第二章数据描述
C
逗号运算符和表达式
形式,表达式 1,表达式 2,…… 表达式 n
结合性,从左向右
优先级,15
逗号表达式 的值:等于表达式 n的值
用途,常用于循环 for语句中例 a=3*5,a*4
a=3*5,a*4,a+5
例 x=(a=3,6*3)
x=a=3,6*a
例 a=1;b=2;c=3;
printf(“%d,%d,%d”,a,b,c);
printf(“%d,%d,%d”,(a,b,c),b,c);
< >
//a=15,表达式值 60
//a=15,表达式值 20
//赋值表达式,表达式值 18,x=18
//逗号表达式,表达式值 18,x=3
//1,2,3
//3,2,3
语言程序设计第三章运算符和表达式
C
逗号运算符和表达式
形式,表达式 1,表达式 2,…… 表达式 n
结合性,从左向右
优先级,15
逗号表达式 的值:等于表达式 n的值
用途,常用于循环 for语句中例,
/*ch2_6.c*/
#include <stdio.h>
main()
{ int x,y=7;
float z=4;
x=(y=y+6,y/z);
printf("x=%d\n",x);
}
运行结果,x=3
< >
语言程序设计第三章运算符和表达式
C
位运算
1.运算对象只能是 整型或字符型数据,不能是实型数据。
C
运算符算术运算符:( + - * / % ++ --)
关系运算符:( < <= == > >= !=)
逻辑运算符:((! && ||)
位运算符,( << >> ~ | ^ &)
赋值运算符:( = 及其扩展)
条件运算符:(?:)
逗号运算符:(,)
指针运算符:( * &)
求字节数,( sizeof)
强制类型转换:(类型)
分量运算符:(,->)
下标运算符:( [])
其它,( ( ) -)
< >
语言程序设计第三章运算符和表达式
C
学习运算符应注意:
运算符功能
与运算量关系
要求运算量个数
要求运算量类型
运算符优先级别
结合方向
结果的类型
< >
语言程序设计第三章运算符和表达式
C
3.1 算术运算
3.2 赋值运算
3.3 自增、自减运算
3.4 关系运算与逻辑运算
3.5 条件运算
3.6 逗号运算
3.7 位运算
3.8 类型转换
3.1 算术运算
3.1.1 算术运算符
基本算术运算符,+ - * / %
结合方向:从左向右
优先级,- ---->* / % -----> + -
(2) (3) (4)
说明:
,-” 可为 单目 运算符时,右结合性
两整数相除,结果为整数
%要求两侧均为整型数据例 5/2 =
-5/2.0 =
例 5%2 =
-5%2 =
1%10 =
5%1 =
5.5%2
例 5/2 2
-5/2.0 = -2.5
例 1
- -1
1
0
(?)
语言程序设计第三章运算符和表达式
C
3.1.2 算术表达式及其书写特点
算术表达式是用算术运算符,圆括号将运算对象连接起来的符合 C语言的语法规则的式子 。 其中,运算对象可以是常量,变量,表达式,函数等等 。
书写时注意以下几点:
① C表达式中的乘号不能省略 。
例如:数学式 b2-4ac 相应的 C表达式应写成,b*b-4*a*c
② C表达式中只能使用系统允许的标识符 。
例如:数学式 πr2 相应的 C表达式应写成,3.14159*r*r
③ C表达式中的内容必须书写在同一行,不允许有分子分母形式,必要时要利用圆括号保证运算的顺序 。
例如,c+d相应的 C表达式应写成,(a+b)/(c+d)
④ C表达式不允许使用方括号和花括号,只能使用圆括号来帮助限定运算顺序 。 可以使用多层圆括号,但左右括号必须配对,
运算时从内层圆括号开始,由内向外依次计算表达式的值 。
语言程序设计第三章运算符和表达式
C
3.2 赋值运算
3.2.1--3.2.2 赋值运算符、赋值表达式
简单赋值运算符,=
赋值表达式
格式,变量标识符 =表达式
作用:将赋值号右边的表达式计算出来,将其值赋给左边的一个变量。
复合赋值运算符
种类,+= -= *= /= %=,=,= &= ^= |=
含义,exp1 op= exp2? exp1 = exp1 op exp2
a+=3 a=a+3
x*=y+8 x=x*(y+8)
x%=3 x=x%3
例 a=3;
d=func();
c=d+2;
语言程序设计第三章运算符和表达式
C
3.2.3 赋值运算符的优先级和结合性
优先级,14
结合方向,自右向左
左侧必须是变量,不能是常量或表达式每个表达式都有一个值(当然每个值都有所属的类型):
赋值表达式的值与变量值相等,且可嵌套
赋值转换 规则,使赋值号右边表达式值 自动 转换成其左边变量的类型例 3=x-2*y;
a+b=3;
例 float f;
int i;
i=10;
f=i;
则 f=10.0
例 int i;
i=2.56; //结果 i=2;
例,a=b=c=5
a=(b=5)
a=5+(c=6)
a=(b=4)+(c=6)
a=(b=10)/(c=2)
< >
//表达式值为 5,a,b,c值为 5
// b=5;a=5
//表达式值 11,c=6,a=11
//表达式值 10,a=10,b=4,c=6
//表达式值 5,a=5,b=10,c=2
语言程序设计第三章运算符和表达式
C
例,a=12;
a+=a-=a*a
例,int a=2;
a%=4-1;
a+=a*=a-=a*=3;
< >
//a=-264 等价于 a=a+(a=a-(a*a))
//a=0 等价于 a=a+(a=a*(a=a-(a=a*3)))
语言程序设计第三章运算符和表达式
C
不同类型数据间的转换
隐式转换
什么情况下发生
运算转换 ------不同类型数据混合运算时
赋值转换 ------把一个值赋给与其类型不同的变量时
输出转换 ------输出时转换成指定的输出格式
函数调用转换 ------实参与形参类型不一致时转换
运算转换规则,不同类型数据运算时先 自动 转换成同一类型
< >
语言程序设计第二章数据描述
C
double float
long
unsigned
int char,short低高 说明,
必定的转换运算对象类型不同时转换例 char ch;
int i;
float f;
double d;
ch/i + f*d - (f+i)
int
int
double
double
double
double
double
double
int
int
double
double
double
double
double
double
10+?a? +i*f - d/l
例 int i;
float f;
double d;
long l;
< >
显式转换(强制转换)
一般形式,( 类型名 ) ( 表达式)
例 (int)(x+y)
(int)x+y
(double)(3/2)
(int)3.6
说明:强制转换得到所需类型的中间变量,原变量类型不变例 main()
{ float x;
int i;
x=3.6;
i=(int)x;
printf(“x=%f,i=%d”,x,i);
}
结果,x=3.600000,i=3
精度损失问题较高类型向较低类型转换时可能发生
< >
语言程序设计第二章数据描述
C
3.3 自增、自减运算
3.3.1--- 3.3.2 自增、自减运算符、表达式、结合性、优先级
作用:使变量值加 1或减 1
种类:
前置 ++i,--i (先执行 i+1或 i-1,再使用 i值)
后置 i++,i-- (先使用 i值,再执行 i+1或 i-1)
例 j=3; k=++j;等价于,j++;k=j;
j=3; k=j++;等价于,k=j;j++;
j=3; printf(“%d”,++j);
j=3; printf(“%d”,j++);
a=3;b=5;c=(++a)*b;
a=3;b=5;c=(a++)*b;
< >
//k=4,j=4
//k=3,j=4
//4
//3
//c=20,a=4
//c=15,a=4
语言程序设计第三章运算符和表达式
C
每个表达式都有一个值(当然每个值都有所属的类型):
… (i++)… 中表达式 (i++)的值是变量 i在 ++之前的值;
但 i++的值已经增 1;
… (++i)… 中表达式 (++i)的值是变量 i在 ++之后的值;
++ -- 不能用于常量和表达式,如 5++,(a+b)++
++ --结合方向,自右向左
优先级,- ++ -- ------>* / % ----->+ -
(2) (3) (4)
例 -i++? -(i++)
i=3; printf(“%d”,-i++); //-3例 j+++k; (j++)+k;例 -i++i=3; printf(“%d”,-i++);
语言程序设计第三章运算符和表达式
C
3.3.3 使用自增、自减运算符的注意事项
② 对于形如 a+++b的表达式,C语言的编译系统在处理时尽可能多的自左至右将若干个字符结合成一个运算符 。 因此,a+++b被理解为 (a++)+b,而不是 a+(++b)。 为避免产生误解,建议将此表达式写成 (a++)+b的形式 。
例如,x=i+++i+++i++;应被理解为 z=(i++)+(i++)+(i++);
自增,自减运算符使得 C的表达式灵活,简洁,但有时候会使初学者迷惑,若使用不当,会产生意外的后果 。 这就需要在使用时尤其注意 。
① 当一个表达式中,含有若干个子表达式时,ANSI C没有规定运算符和运算对象的计算次序,因此不同编译系统处理的顺序可能不同 。
例如,x=a*b+c%d 无所谓;
例如,a=3;y=a*++a;不同的编译系统有两种处理方式,结果不同:
A) 按从左到右的顺序处理为:先取 a的值 3,再计算 ++a,a的值 自增为 4,
子表达式 ++a的值也为 4,所以相乘的结果为 12;
B) 按从右到左的顺序处理为:先计算 ++a,a的值自增为 4,子表达式 ++a的值也为 4,再取 a的值为 4,所以相乘的结果为 16。
③ 在一个表达式中,出现对同一个变量的多次自增、自减运算时,有的编译系统按从左到右的次序处理,而有些系统一次性的处理这些运算是从右到左(如 TURBO C 2.0系统)。
请看下列程序的输出结果。
main( )
{
int i=6,k=6,a,b;
a=(i++)+(i++)+(i++);
b=(++k)+(++k)+(++k);
printf("\ni=%d,k=%d",i,k);
printf("\na=%d,b=%d",a,b);
}
若按从左到右的次序处理,预期的运行结果为:
i=9,k=9
a=21,b=24
TC 2.0 程序的运行结果如下:
i=9,k=9
a=18,b=27
④ 在调用函数时,对于实参的求值顺序,ANSI C也没有规定
。有的系统按从左到右的顺序求值,有的相同按从右到左的顺序求值。
例 3.2】
main( )
{
int i=5;
printf("\n%d,%d",i,++i);
}
若按从左到右的次序处理,预期的运行结果为:
5,6
TC 2.0 程序的运行结果如下:
6,6
⑤ 编写程序时,应注意把可读性放在第一位,避免编写晦涩难懂、容易引起误解的程序。尤其在使用自增、自减运算符时,尽量不要使用易于误解的表达方式。
为了清晰的表达编程者的意图,可以将一个复杂的语句分解成多个简单的语句。
例如,A) y=a*++a; 可改写为 b=++a;
y=a*b;
B) printf("\n%d,%d",i,++i);
可改写为 k=i;
printf("\n%d,%d",k,++i);
C) a=(i++)+(i++)+(i++);
可改写为,x=i++;
y=i++;
z=i++;
a=x+y+z;
关系运算符和关系表达式
关系运算符
种类,< <= == >= > !=
结合方向:自左向右
优先级别:
<
<=
>
>=
==
!=
优先级 6(高)
优先级 7(低)例 c>a+b //c>(a+b)
a>b!=c //(a>b)!=c
a==b<c //a==(b<c)
a=b>c //a=(b>c)
关系表达式的值:是逻辑值“真”或“假”,用 1和 0表示例 int a=3,b=2,c=1,d,f;
a>b
(a>b)==c
b+c<a
d=a>b
f=a>b>c
< >
//表达式值 1
//表达式值 1
//表达式值 0
//d=1
//f=0
语言程序设计第三章运算符和表达式
C
关系运算注意:
< >
例 若 a=0; b=0.5; x=0.3;
则 a<=x<=b的值为 0
例 5>2>7>8在 C中是允许的,
值为 0
例 int i=1,j=7,a;
a=i+(j%4!=0);
则 a= 2
例 ‘ a?>0 结果为
‘ A?>100 结果为
1
0
语言程序设计第二章数据描述
C
关系运算注意:
例 注意区分,=”与,==”
int a=0,b=1;
if(a=b)
printf(“a equal to b”);
else
printf(“a not equal to b”);
语言程序设计第二章数据描述
C
a b !a !b a&&b a||b
真假真假假假真真
逻辑运算符和表达式
逻辑运算符
种类,! && ||
逻辑运算真值表
C语言中,运算量,0表示,假,,
非 0表示,真,,
运算结果,0表示,假,,
1表示,真,,
< >
真假假假假假真真假假真真真假真真语言程序设计第二章数据描述
C
! (2)
&& (11)
|| (12)
高低例 a<=x && x<=b
a>b&&x>y
a==b||x==y
!a||a>b
优先级:
结合方向:
!,从右向左
&&,从左向右
||,从左向右
< >
// (a<=x) && (x<=b)
//(a>b)&&(x>y)
//(a==b)||(x==y)
//(!a)||(a>b)
语言程序设计第二章数据描述
C
! (2)
&& (11)
|| (12)
高低
优先级:
结合方向:
!,从右向左
&&,从左向右
||,从左向右例 a=4;b=5;
!a
a&&b
a||b
!a||b
4&&0||2
5>3&&2||8<4-!0
c?&&?d?
< >
值为 1
值为 0
值为 1
值为 1
值为 1
值为 1
//(5>3)&&2||(8<(4-(!0))) 值为 1
语言程序设计第二章数据描述
C
! (2)
&& (11)
|| (12)
高低
优先级:
结合方向:
!,从右向左
&&,从左向右
||,从左向右
短路特性,逻辑表达式求解时,并非所有的逻辑运算符都被执行,只是在必须执行下一个逻辑运算符才能求出表达式的解时,才执行该运算符
< >
例 a&&b&&c //只在 a为真时,才判别 b的值;
只在 a,b都为真时,才判别 c的值例 a||b||c //只在 a为假时,才判别 b的值;
只在 a,b都为假时,才判别 c的值例 a=1;b=2;c=3;d=4;m=1;n=1;
(m=a>b)&&(n=c>d)
//结果 m=0,n=1
语言程序设计第二章数据描述
C
条件运算符与表达式
一般形式,expr1? expr2,expr3
执行过程
功能:相当于条件语句,但不能取代一般 if语句例 if (a>b)
printf(“%d”,a);
else
printf(“%d”,b);
printf(“%d”,a>b?a:b);
例 求 a+|b|
printf(“a+|b|=%d\n”,b>0?a+b:a-b);
expr1
取 expr2值 取 expr3值非 0 =0
例 (a==b)Y?:?N?
(x%2==1)?1:0
(x>=0)?x:-x
(c>=?a? && c<=?z?)?c-?a?+?A?:c
条件运算符可嵌套如 x>0?1:(x<0?-1:0)
优先级,13
结合方向,自右向左如 a>b?a:c>d?c:d? a>b?a:(c>d?c:d)
expr1,expr2,expr3类型可不同,表达式值取较高的类型
< >
例 xa?:?b? //x=0,表达式值为‘ b?; x?0,表达式值为‘ a?
x>y?1:1.5 //x>y,值为 1.0; x<y,值为 1.5
语言程序设计第二章数据描述
C
逗号运算符和表达式
形式,表达式 1,表达式 2,…… 表达式 n
结合性,从左向右
优先级,15
逗号表达式 的值:等于表达式 n的值
用途,常用于循环 for语句中例 a=3*5,a*4
a=3*5,a*4,a+5
例 x=(a=3,6*3)
x=a=3,6*a
例 a=1;b=2;c=3;
printf(“%d,%d,%d”,a,b,c);
printf(“%d,%d,%d”,(a,b,c),b,c);
< >
//a=15,表达式值 60
//a=15,表达式值 20
//赋值表达式,表达式值 18,x=18
//逗号表达式,表达式值 18,x=3
//1,2,3
//3,2,3
语言程序设计第三章运算符和表达式
C
逗号运算符和表达式
形式,表达式 1,表达式 2,…… 表达式 n
结合性,从左向右
优先级,15
逗号表达式 的值:等于表达式 n的值
用途,常用于循环 for语句中例,
/*ch2_6.c*/
#include <stdio.h>
main()
{ int x,y=7;
float z=4;
x=(y=y+6,y/z);
printf("x=%d\n",x);
}
运行结果,x=3
< >
语言程序设计第三章运算符和表达式
C
位运算
1.运算对象只能是 整型或字符型数据,不能是实型数据。