- 一.算数操作符
- 二.移位操作符
- 1.左移操作符<<
- 2.右移操作符>>
- 三.位操作符
- 四.赋值操作符
- 五.单目操作符
- 六.用于判断条件的操作符
- 七.多目操作符
- 1.
- 🚀 八.下标引用,结构体成员访问
- 1.下标引用操作符:arr[i],表示访问arr数组中下标为i的元素。
- 2.结构体成员访问
- 🏰九.表达式求值
- 1.整形提升
- 1.1整形提升的意义
- 1.2整型提升的方式
- 2.算术转换
- 十.操作符的属性
- 📕总结
+ - * / % ,这几个就叫做算数操作符
但在使用时要注意一下几个点:
1.%操作符只能作用在两个整数上,返回的是整除之后的余数。
2.除了%,其他操作符既可作用于整数,也可作用于浮点数。
将操作数的二进制补码向左移动一位,左边抛弃,右边补0
将操作数的二进制补码向右移动一位
在这里又分两种右移方式:
①逻辑移位:左边补0,右边抛弃
②算数移位:左边补原符号位,右边抛弃
🐻在C语言中右移操作都是算数右移,但可以将一个数强制类型转换成无符号数来实现逻辑右移
★对于移位操作符,不要移动负数位,不然编译器可能会报错
int a =10;
a>>-1;//可能会报错
三.位操作符& //按位与
| //按位或
^ //按位异或
注:他们的操作数必须是整数。
这些操作符是对两个操作数的补码进行操作的。
四.赋值操作符+=
-=
*=
/=
<<= >>=
&=
|=
^=
用法举例:
int a =0;
a+=1;//等价于a=a+1
a>>=1;//等价于a右移一位
a*=3;//等价于a=a*3
这些赋值操作符简化了我们的代码,并提高了代码的可读性,十分好用。
五.单目操作符顾名思义,单目操作符即为操作数只有一个的操作符
常用单目操作符有:
! 逻辑反操作
- 负值
+ 正值
& 取地址
sizeof 求操作数的类型长度(以字节为单位)
~ 对一个数的二进制按位取反
– 前置、后置–
++ 前置、后置++
* 间接访问操作符(解引用操作符)
(类型) 强制类型转换
其中有意思的是前置++和后置++(和- -),前置++是先加再使用,后置则是先使用再加。
可以这么理解:
前置++返回的是加1之后的操作数,后置++返回的则是加1之前的操作数
int a =5;
printf("%d",a++);//输出的是a加1之前的值,即打印5
printf("%d",a);由于上一行代码打印之后a加了1,所以这里打印a的值为6
printf("%d",++a);输出的是a加1之后的值,即打印7
其中sizeof是计算操作数的类型长度的,单位是字节,但sizeof(数组名)又有一点特殊,具体的可以看看我写的另一篇文章详解C语言数组。
六.用于判断条件的操作符>
<
>=
<=
== 判断是否相等
!= 判断是否不相等
&& 逻辑与:两个条件都为真则返回1,否则返回0
|| 逻辑或:至少有一个条件为真则返回1,否则返回0
&&:从左往右判断,只要有一个0则整体返回0,后面的不看了
||:从左往右判断,只要有一个返回1则整体返回1,后面的不看了
int a=5;
int b =10;
int c= 15;
int i =0;
i = ++a||++b||c++;
printf("%d %d %d",a,b,c);//结果为6,10,15
打印的结果为6,10,15,原因是++a返回的值为6,为真,则这个||逻辑或就不会再继续往下进行了,因为结果已经确定了,这样可以节省计算机的工作量。
七.多目操作符 1.exp1?exp2:exp3
这个三目操作符先判断exp1的结果是否为真,若为真则运行exp2代码,若为假则运行exp3。
int a=3;
int b =2;
int max=a>b?a:b//把a,b中较大的值放入max中
2.逗号表达式
逗号表达式就是用逗号隔开的若干表达式,从左往右依次执行,逗号表达式的结果为最后一个表达式的果。
exp1,exp2,exp3……expN
int a =0;
int b =2;
int c = a+=2,b+=3,a>b;
printf("%d %d %d",a,b,c);//打印结果为2,5,0
🚀 八.下标引用,结构体成员访问
1.下标引用操作符:arr[i],表示访问arr数组中下标为i的元素。[ ]是操作符,arr和i是它的两个操作数,arr[i]等价于*(arr+i)
2.结构体成员访问①结构体名.成员名
②结构体指针->成员名
C的整型算术运算总是至少以缺省整型类型的精度来进行的。翻译一下就是C语言中的算数运算总是至少以整型类型的精度来进行的,为了获得这个精度,表达式中的字符和短整型类型操作数在使用之前会被转换成普通整型,这种转换就叫做整型提升。
1.1整形提升的意义1.2整型提升的方式表达式的整型运算要在CPU的相应运算器件内执行,CPU内整型运算器(ALU)的操作数的字节长度
一般就是int的字节长度,同时也是CPU的通用寄存器的长度。
因此,即使两个char类型的相加,在CPU执行时实际上也要先转换为CPU内整型操作数的标准长
度。
通用CPU(general-purpose CPU)是难以直接实现两个8比特字节直接相加运算(虽然机器指令
中可能有这种字节相加指令)。所以,表达式中各种长度可能小于int长度的整型值,都必须先转
换为int或unsigned int,然后才能送入CPU去执行运算。
整型提升是按照变量的数据类型的符号位来提升的
用例子来说明:
char a = 6;
char b = a+1;
这里a的符号位是0,所以整型提升时左边补0。
🐒注意,只要参与了表达式运算,char 类型的a就会发生整型提升
char a =0;
printf("%u",sizeof(+a))//输出的结果为4
在上述代码中,+a是一个表达式,这里发生了整形提升,一个字节的char类型的a被提升为了4个字节,所以这里打印的结果为4。
讲到这里,还是再细说一下sizeof这个操作符
sizeof只是计算操作数的所占空间大小,单位是字节,如果sizeof后面是一个赋值表达式,那么这个表达式也并不会真正去计算,它只会返回这个表达式返回的变量所占的空间大小。
举个栗子:
int a =2;
int c = sizeof(a=a+1);//这里a并不会真的去加1
printf("%d %d",a,c);//打印的结果为2 4
在上述代码中,sizeof只计算a的大小,不去管这个赋值表达式算出的结果,所以a的值仍为2。
而在sizeof(+a)这行代码中,由于+a是一个表达式,所以a会整型提升,这个表达式的所占空间为4个字节,所以sizeof(+a)得到的结果为4。
如果某个操作符的各个操作数属于不同的类型,那么要先将一个操作数转换为另一个操作数的类型,才能继续进行操作。
longdouble
double
float
unsignedlongint longint
unsignedint
int
如果某个操作数在上面列表中的排名较低,那这个操作数要先转换为另一个操作数的类型,之后才能进行运算。
十.操作符的属性📕总结1.操作符的优先级
2.操作符的结合性
3.是否控制求值顺序
- 1.在进行运算操作时(移位操作,赋值操作等),由于内存中存储的是变量的补码,所以实际是在对补码进行操作(整型提升也是对补码提升)。
- 2.无符号数无符号位,如果是要移位操作等,补0。
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
分享名称:操作符详解【C语言】-创新互联
文章来源:http://scgulin.cn/article/hgsoe.html