操作符详解
1.操作符的分类
- 算术操作符:+、-、*、/、%
- 移位操作符:<< >>(只能操作整数)
- 位操作符:& 丨 ∧
- 赋值操作符:=、+=、-=、*=、/=、%=、<<=、>>=、&=、丨=、︿=
- 单目操作符:!、++、--、&、*、+、-、sizeof、(类型)
- 关系操作符:>、>=、<、<=、==、!=
- 逻辑操作符:&&、丨丨
- 条件操作符:?:
- 逗号操作符:,
- 下标引用:[]
- 函数调用:()
- 结构成员访问:. 、 —>
2.原码,反码和补码
二进制的第一位都是表示正负的,0为正,1为负
正整数的原码补码反码都相同
负整数的三种表示各不相同
- 原码:直接将数值按照正负数的形式翻译成二进制得到的就是原码
- 反码:将原码的符号位不变,其他的依次按位取反就可以得到反码
- 补码:反码加一就是补码
ps:反码得到原码也可以使用:取反,+1的操作
对于整形来说,数据存放内存其实存的是补码
3.左移位操作符
移位规则:左边抛弃,右边补0
#incTude cstdio.ho
int main()
{
int num = 10;
iat n= num<<l:
printr(“n= %d\n", n);
printf(“num= %d\n”, num);
return 0;
}
4.右移操作符
移位规则:首先右移运算分两种
举个例子:
#incLude kstdio.h>
int main()
{
int num = 10;
int n = num>>1;
printf(n= %d\n", n);
printf("num= %d\n", num);
return 0;
}
- 逻辑右移:左边用0填充,右边丢弃
- 算术右移:左边用原该值的符号位填充,右边丢弃
注意:对于移位运算符,不要移动负位数,这个是标准未定义的。如int num = 0;num>>-1;//error
5.位操作符:&、丨、︿、~、
看二进制的对应数字
&按位与:有0则0,全1为1
丨按位或:有1为1,全0为0~
︿按位异或:相同为0,不同为1
~按位取反:每一位都取反即可,包括符号位
注意:位操作符是操作数必须是整数
6.举个例子:
我们简化数字,假设a为2二进制是10,b为3二进制是11,第一步ab按位异或数字相同结果是0,数字不同结果是1,结果赋给a为01,第二步继续01和11按位异或,结果10赋给b,第三步10和01按位异或11赋给a,至此,已成艺术。实现了a和b的数值交换。没有创建第三个变量,过程简单。
7.逗号表达式:exp1,exp2,exp3,……expN
逗号表达式就是用逗号隔开的多个表达式,从左向右依次执行,最后一个表达式的结果是整个表达式的结果。
8.结构体
结构体是一些值的集合,这些值称为成员变量。结构体的每一个成员可以是不同类型的变量,如:标量,数组,指针甚至是其他结构体。
- 结构体的声明
struct tag 如: struct Stu
{ {
member-list; char name[20];
}variable-list; int age;
char sex[5];
char id[20];
};
注意结束的分号以及每一句都有分号
- 结构体变量的定义
struct Point 类型申明
{
int x;
int y;
}p1;
struct Point p2;
- 结构体变量初始化
struct Stu s1 = {"zhangsan",20};//初始化
struct Stu s2 = {.age=20,.name="list"};//指定顺序初始化
- 结构体嵌套初始化
struct Node
{
int data;
struct Point p;
struct Node*next;
}n1 {10,{4,5},NULL};//结构体嵌套初始化
struct Node n2 = {20,{5,6},NULL};//结构体嵌套初始化
9.结构成员访问操作符
- 结构体成员的直接访问:结构体变量名.成员名
#include <stdio.h>
struct point
{
int x;
int y;
}p = {1,2};
int main
{
printf("x:%d y:%d\n",p.a,p.y);
return 0;
}
- 结构体成员的间接访问结构体指针->成员名
#include <stdio.h>
struct point
{
int x;
int y;
}p = {1,2};
int main
{
struct Point p = {3,4};
struct Point *ptr = &p;
ptr->x = 10;
ptr->y = 20;
printf("x:%d y:%d\n",ptr->x,ptr->y);
return 0;
}
10.操作符的属性:优先级和结合性
一,必须了解的操作符优先级(由高到低排列)
- 圆括号()
- 自增远算符++,自减运算符--
- 单目运算符+和-(正负)
- 乘法*,除法/
- 加法+,减法-
- 关系运算符><==
- 赋值运算符=
二,结合性
如果两个运算符优先级相同,优先级没办法确定先算哪个了,这时候就看结合性了,根据运算符是左结合还是右结合,决定执行顺序。大部分运算符是左结合(从左到右执行),少数运算符是右执行(从右往左执行)
一般为左结合,右结合包括自增自减正负以及逻辑远算符,取地址,解引用和赋值,简单赋值,和差赋值,积商赋值余数赋值左右移赋值逻辑操作赋值。