# 运算符的概念以及分类
##1.运算符基本概念
- 运算符是告诉编译程序执行特定算术或逻辑操作的符号。
+例如告诉程序, 某两个数相加, 相减等
##2.运算符分类
- 按照功能划分:
+算术运算符
+关系运算符与逻辑运算符
+按位运算符
- 运算符根据参与运算的操作数的个数分为
+单目运算
* 单目运算:只有一个操作数如 : i++ ! sizeof
+双目运算
* 双目运算:有两个操作数如 : a+b
+三目运算
* 三目预算:C语言中唯一的一个,也称为问号表达式 a>b ? 1 : 0
# 运算符的优先级以及结合性
##1.优先级
- C语言中,运算符的运算优先级共分为15级。1 级最高,15 级最低。在表达式中,优先级较高的先于优先级较低的进行运算。而在一个运算量两侧的运算符优先级相同时,则按运算符的结合性所规定的结合方向处理。
> **提示:一般情况下不需要死记硬背优先级, 只需要记住()优先级最高即可**
##2.结合性
- C语言中各运算符的结合性分为两种,即左结合性(自左至右)和右结合性(自右至左)。
+算术运算符的结合性是自左至右,即先左后右。
例如表达式: x-y+z
则y 应先与“-”号结合,执行 x-y 运算,然后再执行+z 的运算。这种自左至右的结合方向就称为“左结合性”。
+而自右至左的结合方向称为“右结合性”。
最典型的右结合性运算符是赋值运算符例如:如x=y=z
由于“=”具有右结合性,应先执行y=z 再执行x=(y=z)运算。
# 算术运算符
##1.算术运算符
|名称|符号|说明|
|--|--|--|
|加法运算符|+|双目运算符,即应有两个量参与加法运算。如a+b,4+8等。具有左结合性。|
|减法运算符|-|双目运算符。但“-”也可作负值运算符,此时为单目运算,如-x,-5等具有左结合性。
|乘法运算符|*|双目运算符,具有左结合性.
|除法运算符|/|双目运算符,具有左结合性。参与运算量均为整型时,结果也为整型,舍去小数。如果运算量中有一个是实型,则结果为双精度实型|
|求余运算符 (模运算符)|%|双目运算符,具有左结合性。要求参与运算的量均为整型,不能应用于float或double 类型。求余运算的结果等于两数相除后的余数,整除时结果为0。
注:
- 整数除于整数,求出来的结果依然是整数
- 浮点型赋值给整型会损失小数部分
- %两侧必须都为整数
- 利用%求出来的余数是正数还是负数,由%左边的被除数决定,被除数是正数,余数就是正数,反之则反
##2.结合性和优先级
- 结合性:从左到右
- 优先级:
+ * / % 优先级 大于 + -
+ 优先级相同则左结合计算
3*5/3+18
先算3*5
然后再算除3
最后结果再+18
##3.算术运算的注意点
- 1.自动类型转换
int a= 10.6;
int b = 10.5 + 1.7;
- 2.自动将大类型转换为了小类型,会丢失精度
自动类型提升
int b = 10.5 + 10;
- 3.将右边的10提升为了double类型
double b = 1.0 / 2;
解决除法的精度问题
- 4.强制类型转换
double a = (double)1 / 2;
double b = (double)(1 / 2);
# 求余运算符
##1.求余运算注意事项
- 参与求余运算的必须是整数
+例如: 10%2 20%3
+错误写法: 12.3%3
10 % 2 = 0
因为 10 可以被2整除, 没有余数
10 % 3 = 1
因为 10除以3余1, 所以结果为1
- 注意
- m%n 求余,相当于m/n 获取余数
+(1)n等于0 无意义
+(2)m等于0 结果为0
+(3)m>n 正常求余如:8%3 = 2
+(4)m<n 结果是m 如:2%4 = 2 1%4 = 1 3%8=3
- 运算结果的正负性取决于第一个运算数,跟后面的运算数无关
10 % 3 = 1
-10 % 3 = -1
10 % -3 = 1
# 赋值运算符
##1.赋值运算符
+简单赋值运算符: =
+复合赋值运算符: +=、-=、*=、/=、%=
##2.赋值表达式
- 什么是表达式?
+将同类型的数据(如常量、变量、函数等),用运算符号按一定的规则连接起来的、有意义的式子称为表达式。
+例如:算术表达式、逻辑表达式、字符表达式等。
- 表达式的特点:
+ 表达式是一个意义的式子,所以一定有返回值
- 赋值表达式
+由“=”连接的式子称为赋值表达式。
* 例如: x = a + b;
> * 等号=左边只能是变量,不能是常量,下面的写法是错误的:10= 10 + 5;
+凡是表达式可以出现的地方均可出现赋值表达式
- 赋值运算符的结合性
+赋值运算符具有右结合性, 而且优先级比算术运算符低
* 例如: int a = 3 + 5; 会先计算3 + 5, 然后再把结果赋值给a
* 例如: int a = b = c = 5; 右结合性可理解为a=(b=(c=5))
# 复合运算符
##1.复合赋值运算符
- 在赋值符“=”之前加上其它二目运算符可构成复合赋值符。
+ /= 除后赋值 变量 /=表达式 如:a/=3;即a=a/3
+ *= 乘后赋值 变量 *=表达式 如:a*=3;即a=a*3
+ %= 取模后赋值 变量 %=表达式 如:a%=3;即a=a%3
+ += 加后赋值 变量 +=表达式 如:a+=3;即a=a+3
+ -= 减后赋值 变量 -=表达式 如:a-=3;即a=a-3
构成复合赋值表达式的一般形式为:
变量双目运算符 = 表达式; 如: a *= 1 + 2;
它等效于
变量 = 变量双目运算符 表达式; 如: a = (1 +2) * a;
>+ 注意:赋值运算符优先级排名14位,仅仅高于“,”运算符。
# 自增运算符
##1.自增、自减运算符介绍
- 在程序设计中,经常遇到“i=i+1”和“i=i-1”这两种极为常用的操作。C语言为这种操作