注意:接下来有关内容使用的是二进制
1. 操作符的分类
算术操作符: + 、- 、* 、/ 、%
%是取余 eg:15%10=5
/是取整 eg:15/10=1
其他的正常类比数学
一.原码,反码,补码(整数的2进制)
符号位都是⽤0表⽰“正”,⽤1表⽰“负”。
最⾼位的1位是被当做符号位,剩余的都是数值位
eg:01000000000000000000000000000001中 最左边的1就是符号位
正整数的原、反、补码都相同。
负整数的三种表⽰⽅法各不相同。
原码:直接将数值按照正负数的形式翻译成⼆进制得到的就是原码.
反码:将原码的符号位不变,其他位依次按位取反就可以得到反码
补码:反码+1就得到补码
eg:5
原码:00000000000000000000000000000101
反码 01111111111111111111111111111010
补码 01111111111111111111111111111011
• 移位操作符::操作数只能是整数。
<<左移
规则:左边抛弃,右边补0
eg:10000000000000000000000000000001<<1
-> 00000000000000000000000000000010
>>右移
规则:(看编译器)
警告⚠ :对于移位运算符,不要移动负数位,这个是标准未定义的
1. 逻辑右移:左边⽤0填充,右边丢弃
2. (通常)算术右移:左边⽤原该值的符号位填充,右边丢弃
eg:-1
10000000000000000000000000000001>>1
-> 11000000000000000000000000000000
• 位操作符:(操作数必须为整数)
&与:有0则0,两个都为1就1
eg:00000000000000000000000000001010
011111111111111111111111111111110101
00000000000000000000000000000001
|或 有1就为1,两个都0就0
^异或 两个相同为0,相异为1 这个可以支持交换律,并且不用担心溢出问题,因为他不存在进位
例子:不能创建临时变量(第三个变量),实现两个整数的交换。
int a = 10;【二进制:00000000000000000000000000001010】
int b = 20;【二进制:00000000000000000000000000010100】
a = a^b; ----》 00000000000000000000000000011110----》为28赋值给a
b = a^b; ----》 00000000000000000000000000001010----》为10赋值给b
a = a^b; -----》 00000000000000000000000000010100----》为20赋值给a
【即完成了交换a=20,b=10】
• 赋值操作符: = 、+= 、 -= 、 *= 、 /= 、%= 、<<= 、>>= 、&= 、|= 、^=
• 单⽬操作符: !、++、--、&、*、+、-、~ 、sizeof、(类型)
• 关系操作符: > 、>= 、< 、<= 、 == 、 !=
• 逗号表达式: ,
使用规则是:从左到右,整个表达式的结果是最后⼀个表达式的结果
• 下标引⽤: []
操作数:⼀个数组名 + ⼀个索引值(下标)
区分:int arr[10]中的[]表示的是大小
arr[10]:中是下标引用操作符
eg:3+5,+是操作符,3和5是操作数
• 函数调⽤: ()
eg:Add(3,5)中Add,3,5是操作数
9. 结构成员访问操作符
struct tag ----自定义
{
member-list;-----成员列表
}variable-list;-----变量列表
注意:分号不能丢
使用时也要初始化一个值:eg:member-list p2={......},p2就是所说的初始化
10. 操作符的属性:优先级、结合性
结构体成员的直接访问是通过点操作符(.)访问的。点操作符接受两个操作数
eg: struct students
{
int age;
double score;
};
int main()
{
struct students x1={18,99.9}
printf("x: %d y: %d\n", x1.age,x1.score);
return 0;
}
优先级
圆括号( () )
• ⾃增运算符( ++ ),⾃减运算符( -- )
• 单⽬运算符( + 和 - )
• 乘法( * ),除法( / )
• 加法( + ),减法( - )
• 关系运算符( < 、 > 等)
• 赋值运算符( = )