操作符详解
1. 操作符分类
- 算数操作符
/----得到的商 %—得到的是余数,对于%只能要求两端都是整型 - 移位操作符
int a = 16;
//>>--右移操作符,移动的是二进制位
int b = a>>1;
右移操作符:
算术右移
右边丢弃,左边补原符号位
逻辑右移
右边丢弃,左边补0
int a = -1;
//整数的二进制表示形式有三种:原码补码反码
//但是存储到内存的是补码
//对于负数,100000.....0001 现在写出的是原码
//1111.....1110 反码 1111....1111补码
左移操作符<<
左边丢弃,右边补0
注意对于移位操作符不能移动负数位
例如 num<<-1;
- 位操作符
&按位与----可以理解为乘法
| 按位或----有一个为1就是1,可以理解为加法
^ 按位异或----同0异1
小练习:求一个整数存储在内存中的二进制1的个数
int main()
{
int num = 0;
int count = 0;
scanf("%d",&num);//输入-1
int i 0;
for(i =0;i<32;i++)//因为是32位
{
if(1 == ((num>>i)&1))//想到得到每一位可以通过和1进行按位与,从最低位开始与
count++;
}
printf("%d\n",count);
return 0;
}
-
赋值操作符
-
单目操作符
!—把真变成假,假变成真
第一种是a为真打印hehe
第二种是a为假打印hehe
sizeof计算变量所占内存空间的大小,单位是字节
结果是2 0
不管a是什么类型,只要放到s这里来,都是s说了算,就是s的大小,短整型2个字节
sizeof表达式不会进行计算,就是个摆设,所以s的值不会发生变化
~按位取反
注意上面是补码,打印出来的则是原码,所以需要转化成原码 最后得到-1
- 关系操作符
7. 逻辑操作符
首先要知道a++是先用a,再++,所以a此时是0,又因为&&是只要有一个为0就都为0,所以&&后面的都没有算,之后a自增为1,bcd都没加,所以结果是1234
如果a改为1呢?
2335
- 条件操作符
b = (a>5?3:-3);
max = (a>b?a:b);
- 逗号表达式
- 下标引用、函数调用和结构成员
关于前两个在之前都有过介绍,现在介绍下结构成员
. 结构体.成员名
-> 结构体指针 ->成员名
//创建了一个结构体类型 struct Stu
struct Stu
{
char name[20];
int age;
char id[20];
};
int main()
{
struct Stu s1 = {“张三”,20,"2018002394};
struct Stu* ps = &s1;
printf("%s\n",ps->name);
//->结构体指针-成员名
//使用struct Stu这个类型创建了一个学生对象s1 并初始化
printf("%s\n",s1.name);
printf("%d\n",s1.age);
//结构体变量.成员名
return 0;
}