4类型转换与运算符
举例
(int)3.14 将3.14转换成整数3
(double)3 将3转换成双精度浮点数 3.0
double(3) 将3转换成双精度浮点数 3.0
(double)(3) 将3转换成双精度浮点数 3.0
以上的转换是强制类型转换,是一种运算
注意:
如果f是float类型的变量,(int)f把f的值去掉小数点作为(int)f的值(运算结果),f仍然是float类型
类型转换
隐式类型转换
当表达式中运算符所操作的数据的类型与实际要求不符时,要进行隐式类型转换,使表达式中各数据的类型符合要求
算术表达式中隐式类型转换规则是:
(1)表达式中如有char、short和enum类型的数据时,自动将它们转换成int类型;
(2)把表达式中不同类型的数据转换成精度最高、占用内存最多的那个数据的类型。
在类型不冲突的赋值表达式中,自动将赋值运算符右边表达式的值的类型转换成左边变量的类型
强制类型转换(又称显式类型转换)
形式为:
(<类型>)<表达式> 或 <类型>(<表达式>)
例如:
(double)3/2 或 double(3)/2
(double)(3/2)或 double(3/2)
运算符
运算符的优先级和结合性
主要分为: 算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符等
根据组成表达式的运算符的不同,表达式可以分为算术表达式、关系表达式、逻辑表达式、位运算表达式、逗号表达式和赋值表达式等。
比如:
a+b-c
+和-的结合方向都是从左向右,称为左结合性
a=b=1
=的结合方向是从右向左,称为右结合性
注意:
1.通常单目、三目和双目中的赋值运算符是右结合性,其余为左结合性
2.不同优先级的运算符,运算顺序按优先级由高到低执行
3.同一优先级的运算符,运算顺序按结合性的规定执行
4.可以使用圆括号()明确运算次序,圆括号()具有最高的优先级
算术运算之一:一元算术运算
+ 正,运算结果同操作数;
- 负,运算结果为操作数的负数;
++ 自增运算符,操作数需左值性质;
-- 自减运算符,操作数需左值性质;
重点:自增、自减运算符示例
++i, --i
前缀形式:运算符在变量前面,表示对变量先自增或自减,然后再参与其它运算,运算结果具有左值性质。
i++, i—
后缀形式:运算符在变量后面,表示变量先参与其它运算,再自增或自减。
例子:
#include <stdio.h>
void main()
{int i=3,j=10,m,n,p,q;
m=++i; n=i++;
p=--j; q=j--;
printf(”i=%d,m=%d,n=%d\n”,i,m,n);
printf(”j=%d,p=%d,q=%d\n”,j,p,q);
}
答案:
i=5,m=4,n=4
j=8,p=9,q=9
注意:
- 不能用于常量和一般表达式。
如:
int a,b,c;
a = (b+c)++; /* 非法!!! */
a = 34++; /* 非法!!! */
- 具有右结合性
如:
int k=3,j;
j=(--k)++; /*j=2,k=3*/
算术运算之二:基本算术运算(二元)
+ 加法,运算结果为两个操作数的和;
- 减法,运算结果为左操作数减去右操作数
的差;
* 乘法,运算结果为两个操作数的乘积;
/ 除法,运算结果为左操作数除以右操作数
的商;
% 求余,运算结果为左操作数除以右操作
数的余数,只用于整型数据,其结果也
是整型 ;
例子:
20 % 6 结果为 2
20 % -6 结果为 2
-20 % 6 结果为 -2
-20 % -6 结果为 -2
注意:
注意:
- 两个整数作/运算,其结果为商的整数部分,商的小数部分直接截去。如:7/5 =1
- 参与%运算的操作数必须是整数,否则出错;其结果也是整数。如:7%5 =2
- %运算结果的符号同左操作数。
赋值运算符和赋值表达式示例
(=右边的“表达式”又可以是一个赋值表达式)
例子:
a=b=5 /*a=(b=5)*/
a=b=c=1 /*a=(b=(c=1))*/
a=5+(c=6) /*c=6,a=11*/
a=(b=4)+(c=6) /*b=4,c=6,a=10*/
a=(b=10)/2 /*b=10,a=5*/
注意:在进行赋值表达式运算时,如果=两边的类型不一致,但都是数值型或字符型时,系统自动地将=右边的表达式的值转换成左边变量的数据类型,然后再赋值给变量。
复合的赋值运算符
10种复合赋值运算符如下:
复合算术运算符(5个) +=,-=,*=,/=,%=
复合位运算符(5个) &=,^=,|=,<<=,>>=
x += 3 等价于 x=x+3
y *= x + 6 等价于 y=y*(x+6)
右结合性
a+=a-=a*a 等价于a=a+(a=(a-a*a) )
复合赋值运算符举例
void main()
{ int a=3,b=9,c=-7;
a+=b;
c+=b;
b+=(a+c);
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=12,b=23,c=2
a=14,b=2,c=2
a=-364