目录
操作符定义及其分类
操作符定义:
指令系统的每一条指令都有一个操作符,它表示该指令应进行什么性质的操作。不同的指令用操作符这个字段的不同编码来表示,每一种编码代表一种指令。
算数操作符
移位操作符
原码,反码,补码
原码:可以简单的理解为我们直接通过一个数写出来的他的二进制形式。其中从左往右第1位是符 号位:正数为0,负数为1。
反码:符号位不变,其余位按位取反得到的就是反码。
补码:反码(最末尾(最右边的第一位))+1得到补码。
要想彻底搞懂这两个操作符,我先提出一个观念。我们在屏幕上看到的数字,暂且称其为表象;其在内存中存储的形式暂且称其为内象。
其中 正数: 表里如一。表象与内象都长得一样,言外之意就是原码,反码和补码都相同
负数: 表里不一。我们看到的是它的原码,但它存储的形式是补码,我们需要计算得到。
左移操作符
![](https://i-blog.csdnimg.cn/blog_migrate/0e93b1bae8c40e6cd07aee5e3b819b41.png)
右移操作符
位操作符
按位与&
规则如下:
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
单目操作符分类:
关系操作符
逻辑操作符
#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;
}
#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,表达式2,表达式3……表达式n
逗号表达式的求解过程是:
先计算表达式1的值,再计算表达式2的值,……一直计算到表达式n的值。最后整个逗号表达式的值是表达式n的值。
例如:
z=(x%y,x/y) 先计算x%y =1,再计算x/y=3,然后 z=(1,3)=3
下标引用操作符
函数调用操作符
#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;
}
操作符的属性
希望可以帮到你,有什么错误希望大家可以在评论区指出来。