c语言操作符详解
前言:
在大家学习语言或者使用语言的过程中,经常会遇到各种各样的操作符计算,由于大家学习时间跨度比较大,或者基础不扎实等问题,经常会将操作符相关问题搞混。在此,特地为解决上述问题,写了一篇博客以期能够帮助大家!
操作符的分类:
- 算术操作符:+、-、*、/、%
- 移位操作符:>
- 位操作符:&、|、^、~
- 赋值操作符:=、+=、-=、*=、/=、%=、=、&=、|=、^=
- 单目操作符:!、++、--、&、*、+、-、sizeof、(类型)
- 关系操作符:>、
1.算术操作符
对于算术操作大家应该比较熟悉,在我们从小到大的学习生活中经常会用到,但是值得注意的是这里面的“/”与“%”操作符的使用,在计算机语言中的使用可能与大家之前接触的不太一样,大家可能经常会搞混淆。在此,特地为大家总结一下,方便大家学习。
1.1 / 用来执行除法
“ / ”的两个操作符都为整数,那么最终计算结果也只会返回整数部分。
举例代码如下:
根据运行结果大家可以看到,尽管a是float(浮点数)类型,但是其运行结果仍然只是保留了整数部分!原因是在C语言中,整除只会最终保留整数部分,舍去小数部分。这里注意小数部分不是四舍五入,而是直接舍弃!
要想实现最终返回值包含浮点数部分,那么“ / ”的两个操作数至少有一个要是浮点型的数字。
举例代码如下:
趁热打铁:
对于这个计算结果,大家可能还心存疑惑,难道结果不应该是2嘛?注意,这边就是用到上面提到的内容,C语言中的整除会舍弃小数,这边 (a / 100)的结果是0,所以最终运行的结果会是0!
1.2 % 用来执行取余(取模)
%在C语言中这个叫取模运算符,其操作数只能是整数,不能用于浮点数。其运算结果返回的是操作数相除的余数。
举例代码如下:
特别声明:对于负数的取模运算,正负决定于第一个操作数的正负。
举例代码如下:
2.移位操作符
> 右移操作符:
注意1:移位操作数只能是整数!并且操作符的作用对象是二进制的补码,故在此之前希望大家熟悉在计算机内部的计算法则和原码、反码、补码的相关知识点。这部分内容,我也会在后期专门出一个文章来介绍。
注意2:对于移位操作符,不能移动负数位。这个标准是未定义的。
例如:
2.1左移操作符:
在二进制补码序列中,采取的规则是:左边抛弃,右边补0。
举例代码如下:
基于二进制补码的微观操作如下:
2.2右移操作符:
规则是:右边抛弃,左边用该数的符号位补充。但是要注意区分正数和负数的区别!
正数的二进制补码最左边的为0,负数为1。
3.位操作符
注意:也都是在二进制补码中进行计算。
运算规则:对于两个操作数的补码,进行上下对照,然后按照运算规则得出一个新的序列。
- & :两个有0就是0,全为1才是1;
- | :两个有1就是1,全为0才是0;
- ^ : 两个相同为0,相异为1;
- ~ :是一个单目操作符,将操作数的补码全部取反,即0变成1,1变成0;
举例代码如下:
一道变态面试题:
//变态面试题:实现两个数字交换(在不创建第三个变量的前提下) int main() { int a = 3; int b = 6; a = a ^ b; b = a ^ b; a = a ^ b; printf("%d %d", a, b); return 0; }
4.赋值操作符
赋值操作符相对来说比较好理解。但是在这边特别需要关注两个点。
- 区分“ = ”与“ == ”: “ = ”用于赋值,比如在给变量进行初始化时;“ == ”代表的时等于,等价于我们日常生活中两个数字相等。
- 其余的赋值操作符都有相同的运算法则。
举例代码如下:
int main() { int a = 10;//这边给a赋值为10 int b = 20;//这里给b赋值为20 int a = b;//这里是将b的值赋值给a a += b;//等价于:a = a + b; a
这两个操作符主要用在结构体中,来对结构体中的成员变量进行访问。
- 、 :主要用于对结构体成员变量的直接访问。
- -> : 主要用于对结构体成员变量的间接访问(指向结构体的指针变量)。这个设计的内容较为复杂,需要在大家熟练掌握指针和结构体相关知识点时才能更好的学习。在作者后期的博客也会有介绍,欢迎大家查询学习。
struct student { int x; int y; }pa = {1,2}; int main() { printf("%d %d", pa.x, pa.y); //输出结果为 1 2 return 0; }
以上是操作符的分类及其用法的总结,希望大家能够通过这篇文章更好了解操作符相关知识!同时由于作者知识水平有限,可能会存在更好的表达方法或者存在错误,也欢迎各位老师能够在评论区批评指正!