目录
操作符和表达式
操作符
分类:
算数操作符
移位操作符
位操作符
赋值操作符
单目操作符
关系操作符
逻辑操作符
条件操作符
逗号表达式
下标引用、函数调用和结构成员
算术操作符
+ - * / %
除了%之外,其他都可作用于整数和浮点数。
对于/,只要两个操作数有浮点数就执行浮点数除法,两个都为整,就整数除法。
%操作数必为赠书,返回余数
移位操作符
<< 左移操作符
>>右移操作符
移动二进制位
右移操作符
当整体右移后,整个二进数左面空出一位,这一位应该填什么?
1、算术移位
右边丢弃,左边补原符号位
2、逻辑右移
右边丢弃,左边补0
一般用算术移位
左移操作符
左边补齐,右边补零
对于移位操作符,不要移动负数位,这个是标准未定义的
int num = 10;
num >> -1
位操作符
& 按位与
| 按位或
^ 按位异或
只作用于整数。针对补码进行计算
&二进制位两个为1才为1,有一个0就为0。
|有一个1则为1
^两个相同为0。相异为1
练习
1、不创建临时变量的情况下,实现两个变量的值互换
int main()
{
int a = 3;
int b = 5;
printf("before: a = %d b = %d\n", a, b);
a = a + b;
b = a - b;
a = a - b;
printf("after: a = %d b = %d\n", a, b);
return 0;
}
如果用这种加减法,当出现溢出情况时,就无法正常出现结果
int main()
{
int a = 3;
int b = 5;
printf("before: a = %d b = %d\n", a, b);
a = a ^ b;
b = a ^ b;
a = a ^ b;
printf("after: a = %d b = %d\n", a, b);
return 0;
}
异或法可以。但是这个仍然有问题,难读,执行效率低。应对面试可以。
2、编写代码,求一个整数存储在内存中的二进制中1的个数
int num = 0;
int count = 0;
scanf("%d", &num);
int i = 0;
for (i = 0; i < 32; i++)
{
if (1 == ((num >> i) & 1))
count++;
}
printf("%d\n", count);
return 0;
赋值操作符
=
复合操作符
+=、-=、*=、/=、%=、>>=、<<=、&=、|=、^=
单目操作符
! 逻辑反操作
int a = 0;
if (!a)
printf("hehe\n");
a为假,!a为真,为真就打出hehe。一般a是假的时候这样写
- 负值
+ 正值
& 取地址
int a = 0;
int* p = &a;
*p = 20;
printf("%d\n", a);
sizeof 操作数的类型长度(以字节为单位)
int a = 10;
char c = 'r';
char* p = &c;
int arr[10] = { 0 };
printf("%d\n", sizeof(a));
printf("%d\n", sizeof(c));
printf("%d\n", sizeof(p));
printf("%d\n", sizeof(*p));
printf("%d\n", sizeof(arr));
a也可以写int, c也可以写char,p也可以写char*,arr也可以写int [10],*p就是取到p这个指针变量里存储的内容,也就是c,所以也就是char。
~ 对一个数的二进制按位取反
-- 前后置--
++ 前后置++
* 间接访问操作符
(类型) 强制类型转换
下一篇再写吧
结束。