【编程之路(008)操作符详解】(C语言实现)

目录

操作符定义及其分类

算数操作符

移位操作符 

原码,反码,补码

左移操作符

 右移操作符

位操作符

按位与&

按位或|

按位异或^

赋值操作符

复合操作符

单目操作符

关系操作符

逻辑操作符

条件操作符

逗号表达式

下标引用操作符

函数调用操作符

访问结构成员操作符

操作符的属性


操作符定义及其分类

操作符定义:

指令系统的每一条指令都有一个操作符,它表示该指令应进行什么性质的操作。不同的指令用操作符这个字段的不同编码来表示,每一种编码代表一种指令。

操作符分类:
算术操作符
移位操作符
位操作符
赋值操作符
单目操作符
关系操作符
逻辑操作符
条件操作符
逗号表达式
下标引用、函数调用和结构成员

算数操作符

算数操作符都有:    +     -   *   /   %
对于 + - *没有什么可以讲的,但是对于剩下的三个需要注意以下问题:
1. 除了 % 操作符之外,其他的几个操作符可以作用于整数和浮点数。
2. % 操作符的两个操作数必须为整数。返回的是整除之后的余数。(5%2=2余1,返回值为1)
3. 对于 / 操作符如果两个操作数都为整数,执行整数除法。而只要有浮点数执行的就是浮点数除法。 (在C语言中,整数的除法使用的相当于是去尾法,如5/2=2(把 小数点后面的都省略))


移位操作符 

<< 左移操作符
>> 右移操作符
注:
移的是整数的二进制位
移位操作符的操作数只能是整数。

原码,反码,补码

原码:可以简单的理解为我们直接通过一个数写出来的他的二进制形式。其中从左往右第1位是符             号位:正数为0,负数为1。

反码:符号位不变,其余位按位取反得到的就是反码。

补码:反码(最末尾(最右边的第一位))+1得到补码。

要想彻底搞懂这两个操作符,我先提出一个观念。我们在屏幕上看到的数字,暂且称其为表象;其在内存中存储的形式暂且称其为内象

其中  正数:  表里如一。表象与内象都长得一样,言外之意就是原码,反码和补码都相同

          负数: 表里不一。我们看到的是它的原码,但它存储的形式是补码,我们需要计算得到。

 

左移操作符

移位规则:
左边抛弃、右边补0

 右移操作符

1. 逻辑移位
左边用 0 填充,右边丢弃
2. 算术移位(大多数编译器都是这样的)
左边用原该值的符号位填充,右边丢弃
具体的图就不画了。
需要特别注意的是 移位都是在补码上进行的,要特别注意负数。
移位后不改变原值。(如a=b>>2)这里的b的值是不改变的,只不过给a赋值的时候赋给的是移位后的值。

位操作符

位操作符都有:
&      按位与
|      按位或
^       按位异或
注:
与移位操作符一样,还是在 二进制位上进行操作。
他们的操作数必须是整数

按位与&

规则如下:

0 & 0= 0 ,0 & 1= 0,1 & 0= 0, 1 & 1= 1

例:

3 &5  即 011 & 101 =001 ,所以 3 & 5的值为1。

记忆时我们把0当假,1当真。把 & 当作数学上的 且 就方便记忆了。


按位或|

规则如下:

 0 | 0= 0 ,  1 | 0= 1  , 0 | 1= 1  ,  1 | 1= 1 

例:

2 | 4 即 010 | 100 = 110 ,所以2 | 4的值为 6 。

把 | 当作数学上的 或 方便记忆。


按位异或^

规则如下:

0 ^ 0=0  , 0 ^ 1= 1  , 1 ^ 0= 1  , 1 ^ 1= 0

例:

2 ^ 4 即 010 ^ 100 =110 ,所以 2 ^ 4 的值为6 。

口诀:相同为0,相异为1


赋值操作符

就是 = 没有什么需要特别注意的,但是要和 == 区分开来,== 是判断是否相等的。

复合操作符

+=   -=    *=    /=    %=    >>=    <<=    &=    |=    ^=
int a = 0
a += 1;
a = a + 1;
//二者完全等效,看个人习惯哪一种

单目操作符

单目操作符定义:

单目就是一个操作数,比如++,a++,操作数只有一个a

单目操作符分类:

!              逻辑反操作(在真前面加!就表示假)
-              负值 
+             正值
&             取地址
sizeof      操作数的类型长度(以字节为单位)
~             对一个数的二进制按位取反
--             前置、后置 --         (后置(a--)先使用变量a,在自减,自减后自身值减1)
++           前置、后置 ++     (前置(++a)先自增,自增后自身值加1,在使用变量a)
*              间接访问操作符 ( 解引用操作符 )
( 类型 )      强制类型转换     int a = (int)b = 1.0

关系操作符

>
>=
<
<=
!=   用于测试 不相等
==       用于测试 相等

逻辑操作符

&&        逻辑与    运算符两边的表达式的值都为true运算结果为true  其余情况为false
||           逻辑或    运算符两边的表达式的值都为false运算结果为false  其余情况为true
另外当一个式子中出现多个逻辑与时
式子1&& 式子3&&式子3
从左往右,有一个式子为假就直接不往后进行判断
#include <stdio.h>
int main()
{
	int i = 0, a = 0, b = 2, c = 3, d = 4;
	i = a++ && ++b && d++;
	printf("a = %d\nb = %d\nc = %d\nd = %d\n", a, b, c, d);
	return 0;
}

另外当一个式子中出现多个逻辑或时
式子1|| 式子3||式子3
从左往右,有一个式子为真就直接不往后进行判断
#include <stdio.h>
int main()
{
	int i = 0, a = 0, b = 2, c = 3, d = 4;
	i = a++||++b||d++;
	printf("a = %d\nb = %d\nc = %d\nd = %d\n", a, b, c, d);
	return 0;
}


条件操作符

exp1 ? exp2 : exp3
exp1是否为真?若真,执行exp2,否则执行exp3。

逗号表达式

逗号表达式的一般形式是:

表达式1,表达式2,表达式3……表达式n


 逗号表达式的求解过程是:

先计算表达式1的值,再计算表达式2的值,……一直计算到表达式n的值。最后整个逗号表达式的值是表达式n的值。

例如:
z=(x%y,x/y)  先计算x%y =1,再计算x/y=3,然后 z=(1,3)=3


下标引用操作符

[ ] 下标引用操作符
操作数:一个数组名 + 一个索引值
int arr [ 10 ]; // 创建数组
arr [ 9 ] = 10 ; // 实用下标引用操作符。
[ ] 的两个操作数是 arr 9

函数调用操作符

接受一个或者多个操作数:第一个操作数是函数名,剩余的操作数就是传递给函数的参数。
#include <stdio.h>
void f1()
{
	printf("hehe\n");
}
void f2(const char* str)
{
	printf("%s\n", str);
}
int main()
{
	f1(); //实用()作为函数调用操作符。
	f2("hello");//实用()作为函数调用操作符。
	return 0;
}

访问结构成员操作符

. 结构体 . 成员名
-> 结构体指针 -> 成员名
#include <stdio.h>
struct Stu
{
	char name[10];
	int age;
	char sex[5];
	double score;
};
void set_age1(struct Stu stu)
    {
		stu.age = 18;
	}
	void set_age2(struct Stu* pStu) {
		pStu->age = 18;//结构成员访问
	}
int main()
{
	struct Stu stu;
	struct Stu* pStu = &stu;//结构成员访问

	stu.age = 20;//结构成员访问
	set_age1(stu);

	pStu->age = 20;//结构成员访问
	set_age2(pStu);
	return 0;
}

操作符的属性

1. 操作符的优先级
2. 操作符的结合性
3. 是否控制求值顺序。

希望可以帮到你,有什么错误希望大家可以在评论区指出来。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值