目录
操作符定义及其分类
算数操作符
移位操作符
原码,反码,补码
左移操作符
右移操作符
位操作符
按位与&
按位或|
按位异或^
赋值操作符
复合操作符
单目操作符
关系操作符
逻辑操作符
条件操作符
逗号表达式
下标引用操作符
函数调用操作符
访问结构成员操作符
操作符的属性
操作符定义及其分类
操作符定义:
指令系统的每一条指令都有一个操作符,它表示该指令应进行什么性质的操作。不同的指令用操作符这个字段的不同编码来表示,每一种编码代表一种指令。
操作符分类: 算术操作符 移位操作符 位操作符 赋值操作符 单目操作符 关系操作符 逻辑操作符 条件操作符 逗号表达式 下标引用、函数调用和结构成员算数操作符 算数操作符都有: + - * / % 对于 + - *没有什么可以讲的,但是对于剩下的三个需要注意以下问题: 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
int main()
{
int i = 0, a = 0, b = 2, c = 3, d = 4;
i = a++ && ++b && d++;
printf("a = %dnb = %dnc = %dnd = %dn", a, b, c, d);
return 0;
}
另外当一个式子中出现多个逻辑或时
式子1||
式子3||式子3
从左往右,有一个式子为真就直接不往后进行判断
#includeint main() { int i = 0, a = 0, b = 2, c = 3, d = 4; i = a++ && ++b && d++; printf("a = %dnb = %dnc = %dnd = %dn", a, b, c, d); return 0; }
#includeint main() { int i = 0, a = 0, b = 2, c = 3, d = 4; i = a++||++b||d++; printf("a = %dnb = %dnc = %dnd = %dn", 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
void f1()
{
printf("hehen");
}
void f2(const char* str)
{
printf("%sn", str);
}
int main()
{
f1(); //实用()作为函数调用操作符。
f2("hello");//实用()作为函数调用操作符。
return 0;
}
访问结构成员操作符
.
结构体
.
成员名
->
结构体指针
->
成员名
#include
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.
是否控制求值顺序。
#includevoid f1() { printf("hehen"); } void f2(const char* str) { printf("%sn", str); } int main() { f1(); //实用()作为函数调用操作符。 f2("hello");//实用()作为函数调用操作符。 return 0; }
访问结构成员操作符
.
结构体
.
成员名
->
结构体指针
->
成员名
#include
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.
是否控制求值顺序。
希望可以帮到你,有什么错误希望大家可以在评论区指出来。



