一、算术运算
(1)运算符:+(加),-(减),*(乘),/(除),%(求余),++(自加),--(自减)
a.优先级 ------ 混合运算时,高优先级先结合
b.结合性 ------ 混合计算时,同一优先级按照结合性结合,比如作加减运算时,从左往右
c.注意运算的对象的个数
注意:
做除法运算时,①两个整型数相除,相当于整除 ②除数不能为0 (数学逻辑上出错)
做求余运算时,①除数不能为0 ②运算数必须是整数 ③结果符号取决于左操作数
取余数应用:① 判断奇数偶数 ② 做%N的运算时,取值范围是 0 ~ N-1
拓展:
如何产生一个随机数?------ 时间是改变的,获取时间作为种子数
int rand(); ------ 伪随机,种子是固定的,
void srand(unsinged int seed); ------ 可以自己提供一个种子,但产生的随机数序列是固定的
time_t time(time_t *tloc); ------ 时间秒数
time (NULL);------ 返回值就是获得的秒数值
eg:从100道题中随机抽取10道题
(2)表达式:运算符和运算数构成的字符序列,表达式都是有值的,有类型的
a.隐式类型转换规则(自动完成):
从右到左 ------- 必转
从下到上 ------- 低精度与高精度运算时,低精度要转高精度。
注:这个过程不是逐级转换的,比如 int * double,int直接转成double
b.强制类型转换(手动完成):
格式:(类型)运算数
注:强制类型转换的本质是运算符,数本身不受影响。
c. a++ 与 ++a
a++ ------ 后置加加 ------ 先用(表达式的结果)后加(让i自增)
++a ------ 前置加加 ------ 先加后用
注意:
① a++ ++a如果单独使用,效果上没有区别
② 先用后加 或 先加后用,是参与到别的运算中时,才发挥作用
③运算数,必须是一个可修改变量
④浮点类型也可以自增自减
问题:int i = 0;i++;在计算机中过程是怎样的?
①int i = 0;在内存中开辟一块4个字节的空间,用来存放 i 的值0;
②i++ 是先用后加,此时内存中临时开辟了一块空间,来存储 i++ 这个表达式的结果0
③最后 i 的空间中原来存的0更新为1
而对于 ++i 来说,是先加后用,i 的空间的值直接从0更新为1,不用临时开辟空间存表达式的值。因此,++i 比 i++ 效率更高。
补充:
左值 ------ 可定位的 ------ 通常是变量
右值 ------ 不可定位 ------ 常量,表达式
注:const int a = 10;------ constant -----常量
------ a其实还是个变量,但是这个变量只读,不能修改
eg:int i = 0;
printf("i = %d\n", i+++++i); ------- 会报错
补充:贪心法 ---- 从左到右逐个扫描,将字符尽可能多地结合成C语言运算符
i++ ++ + i ------ ((i++)++)+ i
分析:按照运算规则,第一个i++先算,它是一个表达式,是右值;然而第二个++运算时,需要一个左值,因此会报错。
二、赋值运算
(1) “ = ” ------ 将一个数赋值给一个变量
int a;
a = 10; //赋值运算,赋值表达式,结果就是a的值 ,类型就是a的类型
注:a=(b=(c=10)) //可以连续赋值
+= //赋值运算
a += 1 ------ a = (a + 1) ----- /=,%=,-=,*= 也类似
(2)不同类型间的混合赋值:
①高进度 => 低精度
double/float => 整型 ==> 精度丢失
②低精度 => 高精度
③长类型=>短类型 //高位截断
④ 短类型=>长类型
无符号短类型 =>长类型 ------ 高位补0
有符号短类型 =>长类型 ------ 符号位扩展 (高位补满符号位,1补1,0补0)
三、逗号运算(优先级最低)
(1)语法:表达式1,表达式2,表达式3,...... 表达式n
(2)运算过程:从左到右,挨个运算
(3)运算结果:是整个式子中最后一个表达式的结果