目录
1.数学算术操作符
在写代码时候,⼀定会涉及到计算。 C语⾔中为了⽅便运算,提供了⼀系列操作符,其中有⼀组操作符叫:算术操作符。分别是: + - * \ % 。
1.1 双目算术操作符:+、-、*、/、%
注:操作符也被叫做:运算符,是不同的翻译,意思是⼀样的。
1.1.1 加( + )和减( - )
+ 和 - ⽤来完成加法和减法。 + 和 - 都是有2个操作数的,位于操作符两端的就是它们的操作数,这种操作符也叫双目操作符。(下面的运算符也是双目的,我就不重复了)
1.1.2 乘( * )
运算符 * ⽤来完成乘法。
1.1.3 除( / )
运算符 / ⽤来完成除法。
特点1:C 语⾔⾥⾯的整数除法是整除,只会返回整数部分,丢弃小数部分。(这与等号左边要接收的变量的变量类型无关)
特点2:如果希望得到浮点数的结果,操作数中必须至少有⼀个浮点数,这时 C 语⾔就会进⾏浮点数除法。
1.1.4 取余( % )
运算符 % 表⽰求模(取余)运算。
特点1:这个运算符只能用于整数,不能用于浮点数。
特点2:负数求模的规则是,先把运算当成正数取余,最后添上正负号,结果的正负号由第一个运算数的正负号决定。
上⾯⽰例中,第⼀个运算数的正负号( 11 或 -11 )决定了结果的正负号。
1.2 赋值操作符( = )
赋值操作符 = 是⼀个随时可以给变量赋值的操作符,它也是双目运算符。
1.2.1 作用:初始化、赋值
在变量创建的时候给⼀个初始值叫初始化;在变量创建好后,再给⼀个值,这叫赋值。
1. int a = 100; // 这叫初始化
2. a = 200; // 这叫赋值
1.2.2 连续赋值
赋值操作符也可以连续赋值,如:
特点1:赋值运算符的逻辑是把右边表达式计算的结果赋予给左边的接收变量。所以当连续赋值时,也是从右向左依次赋值的。
特点2:赋值运算符(=)并不是数学上的等于号,所以当连续赋值时,只允许最右边的表达式可运算,左边的一律都是接收变量。
补充:“赋值”是一种动作,并且规定把右边的值赋给左边;“等于”是一种逻辑判断,只有逻辑运算符(==)才是数学上的等于号。
1.2.3 算术复合赋值符:+=、-=、*=、/=、%=
在写代码时,我们经常可能对⼀个数进⾏⾃增、⾃减等操作,如下:
a = a + 3;
a = a - 2;
a = a * 5;
a = a / 6;
a = a % 3;
我们可以用复合赋值符可以改造上面的代码,如下:
a += 3;
a -= 2;
a *= 5;
a /= 6;
a %= 3;
复合赋值符左右各一个操作数,所以它也是双目运算符。
运用复合赋值符,我们可以减少代码的字数,从而减少代码存储所需要的空间(这也是复合赋值符被创造的原因,因为早期计算机的内存空间非常少)
1.3 单目算术操作符:++、--、+、-
前⾯介绍的操作符都是双⽬操作符,有2个操作数的。C语⾔中还有⼀些操作符只有⼀个操作数,被称 为单⽬操作符。 ++、--、+(正)、-(负) 就是单目操作符的。
1.3.1 ++和--
++是⼀种自增的操作符,⼜分为前置++和后置++,--是⼀种自减的操作符,也分为前置--和后置--.
a1. 前置++
int a = 10;
int b = ++a;//++的操作数是a,是放在a的前⾯的,就是前置++
printf("a=%d b=%d\n",a , b);
先+1,后使⽤。结果如下:
a原来是10,从右边开始运算,a先自增(+1)变成了11;再向左赋值给b,b得到的也是11。所以计算技术后,a和b都是11
上面的代码相当于下面这样:
a2. 后置++
int a = 10;
int b = a++;//++的操作数是a,是放在a的后⾯的,就是后置++
printf("a=%d b=%d\n",a , b);
先使⽤,后+1。结果如下:
a原来是10,先使⽤,就是先赋值给b,b得到了10;然后再自增(+1),然后a变成了11。所以直接结束后a是 11,b是10。
相当于这样的代码:
b1. 前置--
(++和--的规则是一样的,我就不重复这么多了)
b = --a;
等同于:
a = a - 1;
b = a;
b2. 后置--
b = a--;
等同于:
b = a;
a = a - 1;
1.3.2 正和负(+、-)
这⾥的+是正号,-是负号,都是单⽬操作符。
(+):运算符 + 对正负值没有影响,是⼀个完全可以省略的运算符,但是写了也不会报错。
int a = +10; 等价于 int a = 10;
(-):运算符 - ⽤来改变⼀个值的正负号,负数的前⾯加上 - 就会得到正数,正数的前⾯加上 - 会得到负数。
2. 类型转换
2.1 纯算术的类型转换(未赋值时)
先说结论:在算术的表达式中,操作数同时存在整数和浮点数时,计算结果是浮点数。(即整数会自动转化为浮点数)
例子:
无论算术表达式中有多少个整数,只要有一个操作数是浮点数,那么结果是浮点数。
但要是把算术表达式的结果赋值给其他变量,情况可就不一样了。
2.2 隐式类型转换
2.2.1 形式1:“整型变量 = 浮点型运算结果”
结论:浮点型运算结果是浮点数,赋值前先把结果的小数部分去除,再把整数部分赋值给变量。
例子:
1.5 * 3的算术结果是4.5,由于a是整型变量,所以只把整数部分的4赋值给了a。
2.2.2 形式2:“浮点型变量 = 整型运算结果”
结论:整型运算结果是整数,赋值前给算术结果补上精度个小数点0,再把补小数0后的结果赋值给浮点型变量。
例子:
12 / 10的算术结果是1,由于float的精度是6位小数,所以在1后面补上了6个小数点0,最后把1.000000赋值给了b。
2.3 显式类型转换
2.3.1 强制类型转换操作符:()
()是⼀种特殊的操作符,它能对操作数进行强制类型转换,语法形式很简单,形式如下:
1. (数据类型)操作数;
2.3.2 作用
结论:算术表达式中,()至多会用于将浮点数强制转化为整数。
前面 “纯算术的类型转换” 说过,只要存在浮点数就能把结果算成小数,所以把 整数强制转换成浮点数 没什么意义。真把整型强制转换成浮点型,也就只是添加上精度个小数点0
让我们看看强制转换和不强制转换的区别:
第1个表达式中,算术的结果是6.6 * 4等于26.4,进行隐式类型转换后变成了26;
第2个表达式中,对6.6强制转换成6,则算术的结果是6 * 4等于24,所以结果是24;
从显式类型转换的角度看待隐式类型转换:
其实这就相当于将右边整个算术表达式的结果进行强制类型转换。
比如上边的“int a = 4.5 * 3”,这相当于“int a = (int) (4.5 * 3)”;再比如“float b = 12 / 10”,这就相当于“float b = (float) (12 / 10)”。
2.3.3 关于打印的类型转换
先说结论:不强制类型转换,就不能打印不相符类型的变量。
### 1. 用%f打印整型:永远是0.00……
### 2. 用%d打印浮点型:都是很奇怪的大型数字
### 加上强制类型转换,我们才能打印不相符类型的变量:
关于数字运算和类型转换的内容到这里就结束了,喜欢的话不要吝啬您的点赞哦Thanks♪(・ω・)ノ