目录
前言
这篇文章将对C语言的操作符相关知识点,进行详细的讲解,读完本篇文章,您对C语言的了解将更进一步。
一、操作符分类
C语言中对于操作符一共分为十类:(进行简单介绍)
- 算数操作符:加减乘除取余
- 移位操作符:左移(<<),右移(>>)
- 位操作符:按位与(&),按为或(|),按位异或(^)
- 赋值操作符:简单赋值:=;复合赋值:与前三类结合
- 单目操作符:sizeof、取反~、取非!、+、-、++、--、*、强制类型转换()
- 关系操作符:大于等于小于等等
- 逻辑操作符:逻辑与(&&),逻辑或(||)
- 条件操作符:也就是三目运算符
- 逗号表达式:多个表达式由逗号分隔
- 下标引用、函数调用和结构成员:点、->、()、[]
二、算数操作符
算数操作符,也就是对应数学上的算数运算符,最常见的为:加减乘除。
不过在C语言中,还会用到取模(取余)操作,算出操作符的书写形式如下:
+:加
-:减
*:乘
/:除
%:取余
可以看出,加减书写方式与数学中是一样的,乘除与数学中的不同,这里重点讲解一下取余操作符:
#include<stdio.h>
// 算数操作符示例代码:
int main()
{
int a = 10;
int b = 3;
printf("加法:%d\n", a + b);
printf("减法:%d\n", a - b);
printf("除法:%d\n", a / b);
printf("取余法:%d\n", a % b);
return 0;
}
通过结果可知:
- 除法的结果是商。
- 取余的结果是余数
我们再看看几个例子:
对于 / 操作符如果两个操作数都为整数,执行整数除法。而只要有浮点数执行的就是浮点数除法。
加减乘除都可以用在不同类型中,那取余操作符呢?
我们可以得出:
- 除了 % 操作符之外,其他的几个操作符可以作用于整数和浮点数。
- % 操作符的两个操作数必须为整数。返回的是整除之后的余数。
三、移位操作符
<<:左移
>>:右移
关于移位操作符,我们先要了解一些前备知识点。
移位,移的是什么位呢?其实是二进制的位,那二进制是什么呢?
日常生活中,我们看到的数字是用十进制形式表示的,十进制的数据都是由0~9的数字组成的。相同的,二进制是常用在计算机中,由0~1的数字组成。当然,还有8进制、16进制等等,原理相同。
列如,我们算一下10的二进制,要算10的二进制,这里就涉及到如何将10进制转为二进制的知识:
10进制转二进制,我们常用除2取余的方法:
那将二进制转为其它进制呢?方法是权重法
回归主题,在C语言中,数据是以二进制的形式存储在内存中的,而移位操作符,正是对整数的二进制位进行移动。
既然是对整数的二进制位操作,那我们就需要了解整数的二进制是怎么样的呢?
整数的二进制表示形式有3种:原码、反码、补码
C语言规定:
- 正数的原反补码都一样,而负数的原反补不一样,要通过计算。
- 整数在内存中以补码的形式进行存储,对二进制位操作时,也是针对补码,但最终显示给我们看的是原码形式,怎么理解呢?
- 一个整形有32个二进制位,其中第32个位是符号位:正数符号位为0,负数符号位为1。
- 例如int a = -2; 显示给我们看的为-2,即二进制为:符号位(1).....010,但如果我们打印&a -2的地址,我们看到的与我们计算出来的不一样,这就是在内存中以补码形式进行存储,显示时以原码形式。
我们对-2进行图解,讲解原反补的概念:
我们也可以通过编译器来看看:-5在编译器中存储
既然内存中以补码形式存储,对于正数来说,原反补都一样,那负数进行二进制操作后,如何将补码转回原码呢?
两种方法:
- 补码-1取反
- 补码取反+1
<<左移操作符:二进制位相左移动,右边补0。
对a的二进制位进行操作,a的值会改变吗?并不会,这就跟int a = 2; int b = a+2;操作一样,并不会改变a的值,如果要改变,必须对自身赋值。
>>右移操作符:有两种:
- 算数右移:右边丢弃,左边用原理的符号位补充(0为正数、1为负数)
- 逻辑右移:右边丢弃,左边用0填充。
具体那种形式,是由编译器决定的,对于大多数编译器来说,用的是算数右移,具体可以看图解:
最后,关于移位操作符有两点需要注意:
- 移位操作符的操作数只能是整数。
- 对于移动运算符,不要移动负数位,这个是标准未定义的。如:a << -1、a >> -2 .....
四、位操作符
&:按位与
|:按位或
^:按位异或
注:他们的操作数必须是整数
关于位操作符,从名字就能猜出,是针对于二进制位的操作,具体作用如下:
&:一个为0,都为0,两个为1才为1
|:一个为1,都为1,两个为0才为0
^:相同为0,相异为1
代码+图解:
//位操作符
int main()
{
int num1 = 2;
int num2 = 3;
int num3 = num1 & num2;
int num4 = num1 | num2;
int num5 = num1 ^ num2;
printf("&:%d\n", num3);
printf("|:%d\n", num4);
printf("^:%d\n", num5);
return 0;
}
按位异或的三个特点:
- 两个相同值进行异或等于0,因为相同为0
- 任何数与0异或等于本身,因为0遇到1相异为1,遇到0,相同为0,还是本身的二进制
- 支持交换律,如:a^a^b == a^b^a
五、赋值操作符
赋值操作符是C语言用的最多的一个操作符,没什么好讲的,就是简单的赋值操作。
int weight = 120;//体重
weight = 89;//不满意就赋值
double salary = 10000.0;
salary = 20000.0;//使用赋值操作符赋值。
赋值操作符可以连续使用,比如:
int a = 10;
int x = 0;
int y = 20;
a = x = y+1;//连续赋值
这样的代码感觉怎么样?
那同样的语义,你看看:
x = y+1;
a = x;
这样的写法是不是更加清晰爽朗而且易于调试。
赋值操作符还可以与其它操作符结合,称为复合赋值符:其实自己对自己操作后,赋值给自己
+=
-=
*=
/=
%=
>>=
<<=
&=
|=
^=
int x = 10;
x = x+10;
x += 10;//复合赋值
//其他运算符