【C语言】万字详讲操作符

目录

前言

一、操作符分类

二、算数操作符

三、移位操作符

四、位操作符

五、赋值操作符

六、单目操作符

6.1 逻辑反操作

6.2 负值与正值

6.3 取地址

6.4 sizeof

6.5 取反操作符

6.6 --和++操作符

6.7 间接访问操作符(解引用操作符)

6.8 强制类型转换

七、关系操作符

八、逻辑操作符

九、条件操作符

十、逗号表达式

十一、下标引用、函数调用和结构成员

11.1 [] 下标引用操作符

11.2  () 函数调用操作符

11.3 访问结构成员操作符

十二、表达式求值

12.1 隐式类型转换

12.2 算数转换

12.3 操作符的属性

总结


前言

这篇文章将对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取反
  2. 补码取反+1

<<左移操作符:二进制位相左移动,右边补0。

对a的二进制位进行操作,a的值会改变吗?并不会,这就跟int a = 2; int b = a+2;操作一样,并不会改变a的值,如果要改变,必须对自身赋值。


>>右移操作符:有两种:

  1. 算数右移:右边丢弃,左边用原理的符号位补充(0为正数、1为负数)
  2. 逻辑右移:右边丢弃,左边用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;//复合赋值
//其他运算符
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值