C语言运算符

思考问题

1、整数除法与浮点数除法 强制类型转换与隐式类型转换
2、求余运算操作数的要求是什么?求余有哪些应用?
3、 增一减一运算中,操作数的值和表达式的值因其前缀和后缀会有什么变化?

C运算符的分类

1、根据运算性质
赋值运算符/算术运算符/增1和减1/类型强转/关系运算符/逻辑运算符/位运算符

2、根据运算所需的对象
一元(单目)运算符/二元(双目)运算符/三元(三目)运算符

算术表达式:a+b

操作数Operand
运算对象:常量、变量、函数
算术运算符: + – * / %

注意:
1、除法Division 11/5=2整数除法 11.0/5 = 2.2浮点数除法
2、求余Modulus a对b取模 a%b  操作数必须是整数

算术表达式的优先级 

1、 - [取相反数] 【最高】
2、 / % * [除法 求余 乘法] 【较低】
3、 + - [ 加减] 【最低】

按照优先级从高到低运算,如果优先级相同,运算符结合性

左结合(3*4)/2; 右结合-(-4); 巧妙使用圆括号改变运算顺序3*4/(2+2)

思考:
输出一个三位整数个位十位百位数字?

标准数学函数

#include \<math.h>

exp(x) e的x指数
pow(x,y) x的y指数
sqrt(x) x的平方根
fabs(x) x的绝对值
log(x) lnx
log10(x) lgx
sin(x) sinx x为弧度值
cos(x) cosx x为弧度值

赋值运算

变量类型决定了
1、占用内存空间
2、数据的存储形式
3、合法的表述范围    
4、可参与的运算种类

变量名标示了内存中存储单元

思考: 未被初始化的值是什么?

赋值运算符

1、有方向性的 左值和右值类型应一致
2、使用”=”号

赋值表达式中,算术运算符优先级高于赋值运算符
* 简单赋值 变量=表达式
* 多重赋值 变量1=变量2=表达式 (右结合性)a=(b=3) a=a+1 a+=1

如何给变量赋值?
* 赋值表达式语句 【 变量=表达式; a=3;】
* 定义变量的同时为变量赋值 【类型 变量=表达式; 】

注意:

        int a=3; 【int a=b=3;错误】【int a=3,b=3;正确】

计算例子:

int a=3; a += a -= a*a; a的值-12

增1和减1运算符

特性:
* 只能是变量 不能是表达式
* 一元运算符 优先级较高(执行效率更高?)

增1运算符++、减1运算符–
* 前缀prefix  【先对n增1或减1 在使用n的值】  m=++n; n=n+1; m=n;
++n n=n+1;
* 后缀postfix 【先使用n的值,在对n增1/减1】m=n++; m=n; n=n+1;
n– n=n-1;(小窍门,先拿掉后面的++去操作)

结论:操作数的值是相同的 但表达式的值是不同的

例子

printf("%d",-n++); 相当于printf("%d",-n); n=n+1;

优点:增1和减1运算生成的代码效率更高一些
缺点:可读性略差,不同编译器处理方式不同

自动类型转换

注意:
* 相同类型数据的运算结果,类型相同11/5=2
* 不同同类型数据的运算结果 取值范围较大的那种类型 11.0/5=2.0 【类型提升】

类型提升规则
int+float => float + float
long + unsigned int => unsigned long!!!

强制类型转换
15/2 15.0/2

思考
(float)(total/number) 结果7.0000
(float)total/number

如何避免隐式的类型转换?
强制类型转换运算符-类型强转(Casting)一元运算符(类型)变量名

小结:

了解整个计算机系统的发展,图灵机、冯诺依曼机
了解C语言的特性,适合做什么,熟悉其开发IDE
熟悉其关键字与标示符
熟悉变量,定义,属性,熟悉其数据类型,同时由数据类型决定的四个特性:占用内存空间大小、数据的存储形式、合法的表数范围、可参与的运算种类
常量所包含的类型 为什么要有常量 常量的声明有哪几种形式 这两种形式的优劣为什么?

0条留言