第三讲 运算符和表达式一、表达式二、算术运算符和算术表达式四、算术表达式中数据类型的转换三、标准库函数调用六、增量运算符与增量表达式七、逗号运算符与逗号表达式五、赋值运算
1、赋值运算符和赋值表达式
2、复合赋值运算一、表达式表达式,由常量、变量、函数和运算符组成的式子称为表达式。
例,计算圆面积的语句:
s = 3.14159 * r * r ;
该语句中,r,3.14159,3.14159 * r,
3.14159 * r * r,s = 3.14159 * r * r 都是表达式其中,*是运算符,r是变量,3.14159是常量表达式的求值规则,按照运算符的优先级和结合性的规定顺序进行。
有的运算符只需要一个运算对象,这种运算符称为单目运算符;
如 - 5中的( - )负号
需要两个运算对象的称为双目运算符;
如加( + ),减( - ),乘( *),除( /)
一个表达式有一个值及其类型,它们等于计算表达式所得结果的值和类型。
二、算术运算符和算术表达式算术运算符,算术运算符用于各类数值运算。算表达式中的运算对象都是算术量,即整型、实型或字符型。
·ò 2ù ×? êy êy óèá 1? ·ò
£- ·1 1? μ¥ 2 óò?á 1?
£ó ·¨ 4 ×ó?á 1?
£- ·¨ 4 ×ó?á 1?
£a 3? ·¨ 3 ×ó?á 1?
£ˉ 3y ·¨ 3 ×ó?á 1?
£¥?ó óà oò?£ 3 ×ó?á 1?
下表为基本的算术运算符:
其中单目运算符负号( - )的优先级最高,为 2
除法运算符,/”进行求商运算。对于不同类型的运算对象,除法表达式计算结果的类型也会不同。
例,计算 x/y
如果 x,y是整型,则结果为整型,小数部分被略去。
如果 x,y中有一个实型量,则 x,y都被转化为
double类型进行运算,结果为 double类型量运算实例:
x,y为整型量,5/2结果为 2,整型量
2/5结果为 0,整型量
x,y其中一个为实型量,
5.0/2或 5/2.0或 5.0/2.0结果为 2.5,实型量
“%”是求余运算。 a% b计算 a除以 b后的余数,也是 a模 b的值。它要求两个运算对象都是整型量,其结果也是整型量。
例,5% 2结果为 1
2% 5结果为 0
例,将数学式改写成算术表达式一般数学式
[a(b+c)+d]ac
2
2?r
xyyx
x 1?
算术表达式
( a*(b+c)+d)*a*c 将方括号改成圆括号,*不能省略
x/(x+y)+1.0/x*y 其中不能出现分数,改用除法运算符,圆括号不能缺少
3.14159*r*r/2.0 其中 为非字母字符,要用实型常量代替?
例,基本数学运算符程序实例
main ( )
{ int a,b,c1,c2 ;
a=3,b=-7 ;
c1=b/a;
c2=b%a;
printf( "c1=%d\tc2=%d\n",c1,c2 );
c1=a/b;
c2=a%b;
printf( "c1=%d\tc2=%d\n",c1,c2 );
}
程序运行输出:
c1=-2 c2=-1
c1=0 c2=3
三、标准库函数调用
对于某些数学运算,如求平方根,指数、对数运算,C语言中有标准库函数对其进行计算。
调用函数格式:
函数名(参数,参数,… )
其中函数名有由系统提供,不同 C的编译系统,
提供的函数名不同,使用时需查阅相关手册。
调用函数时,参数的类型必须与系统规定一致。
调用标准库函数之前,通常要用预编译命令,#
include”将所需要的库函数信息包含到用户源文件中。
如,在使用数学库函数以前,需使用编译命令
# include,math.h”
例,计算 的值 )2( yxx?
# include,math.h”
main( )
{double x,y;
x=5.0; y=7.0;
printf(“z=% f\n”,x*(2.0+pow(x,y)));
}
四、算术表达式中数据类型的转换
当表达式中的各类数值型数据参与混合运算时,
要进行类型转换。
转换方式
自动转换,数据类型自动由低级向高级转换。
强制转换:将表达式的运算结果强制转换成指定的数据类型。
如下表达式是合法的:
1+ 3.14159+?0?+?A?
float double
long
unsigned
intCharshort 低高
自动转换规则:
例,数据类型自动转换实例有如下变量类型:
char c;
int i;
float f;
double d;
计算表达式:
c+f+i+d
char float int double
c + f + i + d
int double
double double
double
double
强制转换:
格式:
(数据类型说明符)(表达式)
注意,
1)强制转换属单目运算,运算优先级为 2。
2)强制转换得到的是中间变量类型,原变量类型不变。
例,int x,y;
float z;
(float)(x+y);
(int)z+x;
五、赋值运算
1、赋值运算符和赋值表达式赋值表达式的一般格式为:
变量 = 表达式
说明:
赋值运算符左边必须是变量而不能是表达式;
赋值表达式的值是赋值号左边变量被赋值后的值;
例,j+3=j
a*b=c*4
左边的语句是错误的,赋值语句左边只能是变量
如果赋值号两边的类型不一致,则将赋值号右边表达式的值的类型转换成赋值号左边变量的类型;
例,float f=1.0;
int a=2,b=3;
char c=?A?;
f=a+b+c;
赋值表达式 f=a+b+c的值,也就是 f的值为实型量,结果为 70.0
赋值语句可以连续进行。
例,a=b=c=0,该表达式等价于 a=(b=(c=0))
2、复合赋值运算
算术运算符,+ — * / %”和赋值运算符,=”结合起来,形成复合赋值运算符。
变量 OP= 表达式等价于 变量 = 变量 OP 表达式
用 OP表示,+ — * / %”,则复合赋值表达式格式为:
+=,加赋值运算符 ;
如 a+=b+3,等价于 a=a+(b+3)
-=,减赋值运算符 ;
如 a-= b+ 3,等价于 a=a- (b+3)
*=,乘赋值运算符 ;
如 a*= b+ 3,等价于 a=a* (b+3)
/=,除赋值运算符 ;
如 a/= b+ 3,等价于 a=a/ (b+3)
%=,取余赋值运算符
a%= b+ 3,等价于 a=a% (b+3)
复合运算符左边必须是变量;
注意,
复合运算符右边的表达式计算完成后才参与复合赋值运算;
复合赋值运算符的结合性和优先级等同于简单的赋值运算符,=”。
复合运算符常用于某个变量自身的变化,尤其当左边的变量名很长时,使用复合运算符书写更方便。
复合运算符在书写时,两个运算符之间不能有空格。
例,赋值语句程序实例
main( )
{ int a,b,c;
a=b=c=5;
printf(”a=%d,b=%d,c=%d \n”,a,b,c);
a=(b=4)+(c=6);
printf(”a=%d,b=%d,c=%d \n”,a,b,c);
a+=b+c;
printf(”a=%d,b=%d,c=%d \n”,a,b,c);
a+=a-=a*=a;
printf(”a=%d \n”,a);
}
程序运行结果:
a=5,b=5,c=5
a=10,b=4,c=6
a=20,b=4,c=6
a=0
六、增量运算符与增量表达式
类别,单目运算,运算优先级为 2
运算符,++ 使变量的值增 1
-- 使变量的值减 1
结合性及执行过程,
后缀 左结合 i++
i--
前缀 右结合 ++ i
-- i
先使用 i的值,再执行i ±1
先执行i ±1,再使用 i的值
自增、自减运算只能用于变量,不能用于常量和表达式。
注意,
例 ++6,++( a+b)均为非法的运算
自增、自减运算符高于基本算术运算符。
自增、自减运算符的运算顺序。
+,-
++,--( )高 *,/,% +,-
低例,自增、自减运算符程序实例 1
main ( )
{ int x,y,t=3;
printf("t=%d:\n",t );
x=t++;
printf("x=%d,t=%d\n",x,t);
t=3;
printf("t=%d:\n",t );
y = ++t ;
printf("y=%d,t=%d\n",y,t);
}
程序运行结果:
t=3:
x=3,t=4
t=3:
y=4,t=4
例,自增、自减运算符程序实例 2
main( )
{ int i,j,k ;
i=1;
j=1;
k=i+++j ;
printf("k=%d,i=%d,j=%d\n",k,i,j);
}
程序运行结果:
k=2,i=2,j=1
表达式 x+++y 等价于 (x++)+y
例,自增、自减运算符程序实例 3
main()
{ int i,k ;
i=3;
k=i+++i+++i++ ;
printf("1) k=%d\t i=%d\n",k,i);
i=3;
k = (++i)+(++i)+(++i) ;
printf("2) k=%d\t i=%d\n",k,i);
}
程序输出:
1) k=9 i=6
2) k=18 i=6
例,自增、自减运算符程序实例 4
main ( )
{ int x,a,b,c,d ;
x=3;
printf("%d\t%d\t%d\t%d\n",x,x++,x,x--);
a=x=3; b=x++ ;
c=x; d=x--;
printf("%d\t%d\t%d\t%d\n",a,b,c,d );
}
程序运行结果:
3 2 2 3
3 3 4 4
七、逗号运算符与逗号表达式
逗号运算符,或称顺序求值运算符
运算符:,
运算优先级:最低,15级
结合性:左结合
逗号表达式:由逗号运算符连接起来的两个或两个以上的表达式。
格式:
表达式 1,表达式 2,······,表达式 n
求解过程,先求表达式 1的值,再求表达式 2的值,···,直至求出表达式 n的值。整个表达式的值为表达式 n的值。
例,
1) x=0,y=100
2) x=5*8,6+9
3) x=1,y=99,z=(x+y)*5
4) x=(i=10,j=5,i*j)
5) x=i=10,j=5,i*j
先后给 x,y的赋值,表达式的值为 100
先把 x赋值为 40,表达式的值为 15
给 x,y赋值后,计算 z的值,表达式的值为 500
等价于赋值语句 x= 50
先给 x,i赋值,再给 j赋值,
计算 i*j,表达式的值为
50
1、赋值运算符和赋值表达式
2、复合赋值运算一、表达式表达式,由常量、变量、函数和运算符组成的式子称为表达式。
例,计算圆面积的语句:
s = 3.14159 * r * r ;
该语句中,r,3.14159,3.14159 * r,
3.14159 * r * r,s = 3.14159 * r * r 都是表达式其中,*是运算符,r是变量,3.14159是常量表达式的求值规则,按照运算符的优先级和结合性的规定顺序进行。
有的运算符只需要一个运算对象,这种运算符称为单目运算符;
如 - 5中的( - )负号
需要两个运算对象的称为双目运算符;
如加( + ),减( - ),乘( *),除( /)
一个表达式有一个值及其类型,它们等于计算表达式所得结果的值和类型。
二、算术运算符和算术表达式算术运算符,算术运算符用于各类数值运算。算表达式中的运算对象都是算术量,即整型、实型或字符型。
·ò 2ù ×? êy êy óèá 1? ·ò
£- ·1 1? μ¥ 2 óò?á 1?
£ó ·¨ 4 ×ó?á 1?
£- ·¨ 4 ×ó?á 1?
£a 3? ·¨ 3 ×ó?á 1?
£ˉ 3y ·¨ 3 ×ó?á 1?
£¥?ó óà oò?£ 3 ×ó?á 1?
下表为基本的算术运算符:
其中单目运算符负号( - )的优先级最高,为 2
除法运算符,/”进行求商运算。对于不同类型的运算对象,除法表达式计算结果的类型也会不同。
例,计算 x/y
如果 x,y是整型,则结果为整型,小数部分被略去。
如果 x,y中有一个实型量,则 x,y都被转化为
double类型进行运算,结果为 double类型量运算实例:
x,y为整型量,5/2结果为 2,整型量
2/5结果为 0,整型量
x,y其中一个为实型量,
5.0/2或 5/2.0或 5.0/2.0结果为 2.5,实型量
“%”是求余运算。 a% b计算 a除以 b后的余数,也是 a模 b的值。它要求两个运算对象都是整型量,其结果也是整型量。
例,5% 2结果为 1
2% 5结果为 0
例,将数学式改写成算术表达式一般数学式
[a(b+c)+d]ac
2
2?r
xyyx
x 1?
算术表达式
( a*(b+c)+d)*a*c 将方括号改成圆括号,*不能省略
x/(x+y)+1.0/x*y 其中不能出现分数,改用除法运算符,圆括号不能缺少
3.14159*r*r/2.0 其中 为非字母字符,要用实型常量代替?
例,基本数学运算符程序实例
main ( )
{ int a,b,c1,c2 ;
a=3,b=-7 ;
c1=b/a;
c2=b%a;
printf( "c1=%d\tc2=%d\n",c1,c2 );
c1=a/b;
c2=a%b;
printf( "c1=%d\tc2=%d\n",c1,c2 );
}
程序运行输出:
c1=-2 c2=-1
c1=0 c2=3
三、标准库函数调用
对于某些数学运算,如求平方根,指数、对数运算,C语言中有标准库函数对其进行计算。
调用函数格式:
函数名(参数,参数,… )
其中函数名有由系统提供,不同 C的编译系统,
提供的函数名不同,使用时需查阅相关手册。
调用函数时,参数的类型必须与系统规定一致。
调用标准库函数之前,通常要用预编译命令,#
include”将所需要的库函数信息包含到用户源文件中。
如,在使用数学库函数以前,需使用编译命令
# include,math.h”
例,计算 的值 )2( yxx?
# include,math.h”
main( )
{double x,y;
x=5.0; y=7.0;
printf(“z=% f\n”,x*(2.0+pow(x,y)));
}
四、算术表达式中数据类型的转换
当表达式中的各类数值型数据参与混合运算时,
要进行类型转换。
转换方式
自动转换,数据类型自动由低级向高级转换。
强制转换:将表达式的运算结果强制转换成指定的数据类型。
如下表达式是合法的:
1+ 3.14159+?0?+?A?
float double
long
unsigned
intCharshort 低高
自动转换规则:
例,数据类型自动转换实例有如下变量类型:
char c;
int i;
float f;
double d;
计算表达式:
c+f+i+d
char float int double
c + f + i + d
int double
double double
double
double
强制转换:
格式:
(数据类型说明符)(表达式)
注意,
1)强制转换属单目运算,运算优先级为 2。
2)强制转换得到的是中间变量类型,原变量类型不变。
例,int x,y;
float z;
(float)(x+y);
(int)z+x;
五、赋值运算
1、赋值运算符和赋值表达式赋值表达式的一般格式为:
变量 = 表达式
说明:
赋值运算符左边必须是变量而不能是表达式;
赋值表达式的值是赋值号左边变量被赋值后的值;
例,j+3=j
a*b=c*4
左边的语句是错误的,赋值语句左边只能是变量
如果赋值号两边的类型不一致,则将赋值号右边表达式的值的类型转换成赋值号左边变量的类型;
例,float f=1.0;
int a=2,b=3;
char c=?A?;
f=a+b+c;
赋值表达式 f=a+b+c的值,也就是 f的值为实型量,结果为 70.0
赋值语句可以连续进行。
例,a=b=c=0,该表达式等价于 a=(b=(c=0))
2、复合赋值运算
算术运算符,+ — * / %”和赋值运算符,=”结合起来,形成复合赋值运算符。
变量 OP= 表达式等价于 变量 = 变量 OP 表达式
用 OP表示,+ — * / %”,则复合赋值表达式格式为:
+=,加赋值运算符 ;
如 a+=b+3,等价于 a=a+(b+3)
-=,减赋值运算符 ;
如 a-= b+ 3,等价于 a=a- (b+3)
*=,乘赋值运算符 ;
如 a*= b+ 3,等价于 a=a* (b+3)
/=,除赋值运算符 ;
如 a/= b+ 3,等价于 a=a/ (b+3)
%=,取余赋值运算符
a%= b+ 3,等价于 a=a% (b+3)
复合运算符左边必须是变量;
注意,
复合运算符右边的表达式计算完成后才参与复合赋值运算;
复合赋值运算符的结合性和优先级等同于简单的赋值运算符,=”。
复合运算符常用于某个变量自身的变化,尤其当左边的变量名很长时,使用复合运算符书写更方便。
复合运算符在书写时,两个运算符之间不能有空格。
例,赋值语句程序实例
main( )
{ int a,b,c;
a=b=c=5;
printf(”a=%d,b=%d,c=%d \n”,a,b,c);
a=(b=4)+(c=6);
printf(”a=%d,b=%d,c=%d \n”,a,b,c);
a+=b+c;
printf(”a=%d,b=%d,c=%d \n”,a,b,c);
a+=a-=a*=a;
printf(”a=%d \n”,a);
}
程序运行结果:
a=5,b=5,c=5
a=10,b=4,c=6
a=20,b=4,c=6
a=0
六、增量运算符与增量表达式
类别,单目运算,运算优先级为 2
运算符,++ 使变量的值增 1
-- 使变量的值减 1
结合性及执行过程,
后缀 左结合 i++
i--
前缀 右结合 ++ i
-- i
先使用 i的值,再执行i ±1
先执行i ±1,再使用 i的值
自增、自减运算只能用于变量,不能用于常量和表达式。
注意,
例 ++6,++( a+b)均为非法的运算
自增、自减运算符高于基本算术运算符。
自增、自减运算符的运算顺序。
+,-
++,--( )高 *,/,% +,-
低例,自增、自减运算符程序实例 1
main ( )
{ int x,y,t=3;
printf("t=%d:\n",t );
x=t++;
printf("x=%d,t=%d\n",x,t);
t=3;
printf("t=%d:\n",t );
y = ++t ;
printf("y=%d,t=%d\n",y,t);
}
程序运行结果:
t=3:
x=3,t=4
t=3:
y=4,t=4
例,自增、自减运算符程序实例 2
main( )
{ int i,j,k ;
i=1;
j=1;
k=i+++j ;
printf("k=%d,i=%d,j=%d\n",k,i,j);
}
程序运行结果:
k=2,i=2,j=1
表达式 x+++y 等价于 (x++)+y
例,自增、自减运算符程序实例 3
main()
{ int i,k ;
i=3;
k=i+++i+++i++ ;
printf("1) k=%d\t i=%d\n",k,i);
i=3;
k = (++i)+(++i)+(++i) ;
printf("2) k=%d\t i=%d\n",k,i);
}
程序输出:
1) k=9 i=6
2) k=18 i=6
例,自增、自减运算符程序实例 4
main ( )
{ int x,a,b,c,d ;
x=3;
printf("%d\t%d\t%d\t%d\n",x,x++,x,x--);
a=x=3; b=x++ ;
c=x; d=x--;
printf("%d\t%d\t%d\t%d\n",a,b,c,d );
}
程序运行结果:
3 2 2 3
3 3 4 4
七、逗号运算符与逗号表达式
逗号运算符,或称顺序求值运算符
运算符:,
运算优先级:最低,15级
结合性:左结合
逗号表达式:由逗号运算符连接起来的两个或两个以上的表达式。
格式:
表达式 1,表达式 2,······,表达式 n
求解过程,先求表达式 1的值,再求表达式 2的值,···,直至求出表达式 n的值。整个表达式的值为表达式 n的值。
例,
1) x=0,y=100
2) x=5*8,6+9
3) x=1,y=99,z=(x+y)*5
4) x=(i=10,j=5,i*j)
5) x=i=10,j=5,i*j
先后给 x,y的赋值,表达式的值为 100
先把 x赋值为 40,表达式的值为 15
给 x,y赋值后,计算 z的值,表达式的值为 500
等价于赋值语句 x= 50
先给 x,i赋值,再给 j赋值,
计算 i*j,表达式的值为
50