一、【了解】运算符基本概念和分类
本小节知识点:
1.【了解】基本概念
2.【了解】运算符分类
3.【了解】运算符的优先级
4.【了解】运算符的结合性
1、运算符的基本概念
突击考试:小学1年级期末考
第一题:请在圆圈处填上“+”或“—”
8○5=3 20○3=23
第二题:请在圆圈处填上“>”“<” “=”
13○26 6+8○8+6
16-5○10 5+2○10-2
第三题:请在圆圈处填上“>”“<” “=”
14^23○13*24+12
看到这道题,你的表情是否如此?
上面那些,是我们现实生活中的数学运算符,在程序里是怎样的呢?比如假如说需要你写一个程序计算两个数的和,那么该怎么做?所以,我们必须要了解一下程序里的运算符!
那么什么是程序里的运算符呢?
度娘告诉大家:运算符用于执行程序代码运算,会针对一个或以上的操作数项目来进行运算。
翻译成人话:简单来说,就是给程序里面的数据做运算的符号。
比如:昨天学的 int a = 10 你能猜到哪个是运算符吗?
二、运算符的分类
按照功能可划分:
1)算术运算符
2)关系运算符
3)逻辑运算符
4)换位运算符
按照参与运算的个数可分为:
1)单目运算:只有一个操作数 如:i ++ -a;
2)双目运算:有两个操作数 如:a + b;
3)三目运算:C语言中唯一的一个,也叫问号表达式 a > b ? 1 : 0
3、运算符的优先级
当一个运算式中是由不同的运算符组成的,那么该怎么进行计算呢?
比如说 10 + 20 x 2 - 10 ÷ 2 该怎么算?
张三:应该从左往右算。所以结果是25
李四:应该先乘除后加减,所以结果是45
小学一年级time!
请问:数学的运算规则是?
“先乘除后加减,如果有括号的先算括号里面的”
正因为有了这些规则,才使得有不同的运算符时,也能统一获得正确的答案,那么在程序里如果遇到不同的运算符该怎么办呢?
少侠莫慌,老衲给你一张祖传的表,你就知道该怎么做了!
从上图我们可以看到C语言中的运算优先级共分为15 级。1 级最高,15 级最低。 优先级较高的先于优先级较低的进行运算。
4、运算符的结合性
如果运算优先级都相同的话,那么又该怎么计算呢?
如:3 * 4 / 2 * 3
上面这表达式,究竟该先算哪步呢?
这就引申出了我们今天要学的另外一个概念:运算符的结合性
运算符的结合性是指相同优先级的运算符在同一个表达式中,且没有括号的时候,运算符和操作数的结合方式,通常有从左到右结合和从右到左结合两种方式。
例如表达式x-y+z 则y 应先与“-”号结合,执行 x-y 运算,然后再执行+z 的运算。这种自左至右的结合 方向就称为“左结合性”。
而自右至左的结合方向称为“右结合性”。最典型的右结合性运算符是赋值运算符。
如x=y=z,由于“=”的 右结合性,应先执行y=z 再执行x=(y=z)运算。
二、【掌握】算术运算符及赋值运算符
本小节知识点:
1.【理解】算术运算符介绍和使用
2.【掌握】算术运算符的结合性和优先级
1、算术运算符和赋值运算符的介绍和使用
1)算术运算符
使用方法:跟数学中的用法基本一致,但略有些差别,具体下面再讲。
例:
5 + 3 10-6 3*4 8/2 10%3
这样的用算术运算符结合起来的式子,我们就称之为算术表达式。
以后我们还会接触到更多的表达式,比如逻辑表达式,字符表达式等。
但凡表达式,都一点有1个结果,比如上面的每个表达式,都会有结果。
但是,如果我们不对这个结果进行处理,那么很明显表达式是毫无意义的。
所以在我们程序中,对表达式的结果是需要进行处理的,而处理表达式的结果的最常用的方式:就是 通过赋值符号将表达式的结果存储在1个变量之中。
2)赋值运算符
赋值运算符记为“=”,由“=”连接的式子称为赋值表达式。
其一般形式为: 变量 = 表达式
其作用为:将“=”右边的值或者计算后的结果赋值给左边的变量
例如: inta = 5 + 3;
我们将算术表达式5 + 3的结果存储在变量a中了。
注意:“=”在程序中代表“赋值号”与数学中的“等号”完全不同的概念!
比如说 char a;
a = 'b' ,这在数学中是完全不可理解的!!但是在程序中因为不是等于的作用,而是赋值,意为把字符'b'赋值给变量a。
算术运算符与赋值运算符联合应用,具体如下:
加法:
减法:
乘法:
除法:
int main(int
argc, const char * argv[]) {
//定义了三个int类型的变量
int a = 10,b =3,result = 0;
//用a所存的值除以b所存的值,把结果赋值给result
result =
a / b;
//打印结果
printf("a/b的结果是:%d
\n",result);
return 0;
}
在此,想请问同学们:接下来的值是打印3.33333333333……还是什么呢?
Duang!
答案一出:居然是3
无图无真相,上图!
为什么是3而不是3.3333333……呢?
这是因为,在c语言中,如果参与运算的都是整数,那么所得到的也是整数。
那么,此时再讲代码稍微变动一下
int main(int
argc, const char * argv[]) {
//定义了三个int类型的变量
int a = 10,b =3,result = 0;
//这里增加一个单精度小数类型
float c = 3.0f;
//用a所存的值除以单精度c,把值赋给result
result =
a / c;
//打印结果
printf("a/c的结果是:%d
\n",result);
return 0;
}
我们增加了c这么一个小数,并且用a除以c。
那么打印的结果是否如我们所愿变为3.33333333了呢?
可结果依然为3,如图:
看到这,相信你们的表情是这样的
为何会这样呢?
我们注意看:result是一个整数类型,而当你将一个小数类型赋值给整数类型时,会自动触发一个类型转换,即:将那个小数的整数部分赋值给了result
例如:int a =3.23; 实际a只取到了3.23的整数部分,即a的值为3
取余:
注意:取余只能用在整数间,不能用在小数中!
余数的正负性:只跟第一个运算数有关!
2、算术运算符的结合性和优先级
结合性:从左往右
优先级:先乘除后加减
如:
如果是同级的算术运算符,那么运算规则为:从左往右依次运算!
如:35/3 ----> 先算35,再用结果除以3
三、【掌握】算术运算符中的类型转换问题
在上一节中,我们了解到,把小数赋值给整数时,会发生一个截取作用(只截取小数的整数),这在C语言中,其实称之为类型转换!
类型转换分为:隐式数据类型转换 、显示数据类型转换
1)隐式转换:
int i=1; i=i+9.801
按照隐式处理方式,在处理i=i+9.801时,首先i转换为double型,然后进行相加,结果为double型,再将double型转换为整型赋给i
2)显示转换:
int i=1;
i=i+(int)9.801
这时直接将9.801转换成整型,然后与i相加,再把结果赋给i。这样可把二次转换简化为一次转换。显示类型转换的方法是在被转换对象(或表达式)前加类型标识符,
其格式是: (类型标识符)表达式
将大范围的数据赋值给小范围变量时,系统会自动做一个强制类型转换的操作,这样容易丢失精度
int
i = 10.7;
也可用明显地进行强制转换
int
i = (int) 10.7;
常见的类型转换
int a = 198l; // long 转换为 int
charb = 65; // int 转换为 char
int c = 19.5f; //
float 转换为int
四、【掌握】复合运算符
思考:
学生a考试成绩不理想,然后找老师聊了一下后,老师决定给她的分加10分。那么在程序里怎么实现呢?
//学生a的分数为55分
int a = 55;
//让学生a的分数在原来的基础上加10分
a = a +10;
那么,除了上面这种方式,是否还有另外一种看起来更高大上的呢?
有的,那就是我们的复合运算符!
//学生a的分数为55分
int a= 55;
//让学生a的分数在原来的基础上加10分
a += 10; //这句话等价于a=a+ 10;
复合运算符作用就是:让变量的值在自身的基础之上进行运算。
除了 “+=”,还有
-=
*=
/=
%=