目录
[3.1. 左移操作数](#3.1. 左移操作数)
[3.2 右移操作符](#3.2 右移操作符)
一、操作符分类
操作符分为算术操作符、移位操作符、位操作符、赋值操作符、单目操作符、关系操作符、逻辑操作符、条件操作符、逗号表达式和下标引用、函数调用与结构体成员。
二、算术操作符
- * / %
除% 操作符 外,其他操作符可以作用于整数和浮点数 ; / 操作符 ,如果两个操作数都为整数,执行整数除法 ,而只要有浮点数就执行浮点数除法 ;% 操作符的两个操作数必须为整数,返回的是整除之后的余数。
三、移位操作符
<< 左移操作符
>> 右移操作符
移位操作符的操作数只能是整数。
3.1. 左移操作数
移位规则:丢弃最左边,在最右边补0
3.2 右移操作符
右移分为两种:1.逻辑右移:最左边用0填充,丢弃最右边 ;2**.算数移位:最左边填充该值的符号位,丢弃最右边**。
不能移动负数位,这是标准为定义,使用会出错。
四、位操作符
& 按位与 | 按位或 ^按位异或
操作数必须是整数。
示例 求一个整数存储在内存中的二进制中1的个数
#include <stdio.h>
//方法1
int main()
{
int num = 10;
int count=0;
while(num)
{
if(num%2 == 1)
count++;
num = num/2;
}
printf("二进制中1的个数 = %d\n", count);
return 0;
}
//方法2
int main()
{
int num = -1;
int i = 0;
int count = 0;
for(i=0; i<32; i++)
{
if( num & (1 << i) )
count++;
}
printf("二进制中1的个数 = %d\n",count);
return 0;
}
//方法3
int main()
{
int num = -1;
int i = 0;
int count = 0;
while(num)
{
count++;
num = num&(num-1);
}
printf("二进制中1的个数 = %d\n",count);
return 0;
}
五、赋值操作符
= 赋值操作符
int a=10;
复合赋值符
+= -= *= /= %= >>= <<= &= |= ^=
int x=10;x=x+10;
x+=10;//达到上述同样效果
六、单目操作符
! 逻辑反操作 - 负值 + 正值 & 取地址 sizeof 操作数类型长度
~ 对一个数的二进制按位取反 -- 前置、后置-- ++前置、后置++
* 间接访问操作符(解引用操作) (类型) 强制类型转化
示例
int main()
{
int a = -10;
int* p = NULL;
printf("%d\n", !2);//0
printf("%d\n", !0);//1
a = -a;
p = &a;
printf("%d\n", sizeof(a));//4
printf("%d\n", sizeof(int));//4
printf("%d\n", sizeof a);//4
printf("%d\n", sizeof int);//报错
return 0;
}
int main(){
int a = 10;
int x = a++;//先使用,再增加,这样x的值是10;之后a变成11;--同理
int y = ++a;//先自增,再使用,这样a的值是11;之后y变成11;--同理
return 0;
}
七、关系操作符
> >= < <= !=(不等于) ==
八、逻辑操作符
&& 逻辑与 || 逻辑或
1&2----->0 按位与1&&2---->1 逻辑与
1|2----->3 按位或
1||2---->1 逻辑或
逻辑与特点:在表达式1&&表达式2中,只要表达式1为假(0)结果就为假(0),后面语句不在执行。
int main()
{
int i = 0, a = 0, b = 2, c = 3, d = 4;
i = a++ && ++b && d++;
printf(" a = %d\n b = %d\n c = %d\n d = %d\n", a, b, c, d);
return 0;
}
逻辑或特点:在表达式1 || 表达式2中,只要表达式1为真(非0),结果就为真(非0),后面语句不再执行。
int main()
{
int i = 0, a = 0, b = 2, c = 3, d = 4;
i = a++||++b||d++;
printf(" a = %d\n b = %d\n c = %d\n d = %d\n", a, b, c, d);
return 0;
}
九、条件操作符
表达式1?表达式2:表达式3
如果表达式1为真(非0)结果为表达式2的结果,否则为表达式3的结果。
十、逗号表达式
表达式1,表达式2,表达式3,表达式4,......
逗号表达式,从左向右依次执行。整个表达式的结果是最后一个表达式的结果。
int main()
{
int a = 1;
int b = 2;
int c = (a > b, a = b + 10, a, b = a + 1);
printf("%d", c);
return 0;
}
十一、下标引用函数调用和结构体成员
1.[ ] 下标引用操作符,操作数:数组名和索引值
int arr[10];
arr[9] = 10;
2.函数调用操作符
接受一个或者多个操作数:第一个操作数是函数名,剩余的操作数就是传递给函数的参数。
void test1()
{
printf("hehe\n");
}
void test2(const char *str)
{
printf("%s\n", str);
}
int main()
{
test1();
test2("hello bit.");
return 0;
}
3.访问结构体成员
. 结构体名.成员名 -> 结构体指针->成员名
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;
}