操作符和表达式
1.算数操作符
+ - * / %1.除了%操作符之外,其他几个操作符可以用于整数和浮点数。
2.对于 / 操作符如果两个操作数都为整数,执行整数除法。而只要浮点数执行的就是浮点数除法。
3.%操作符的两个操作数必须为整数。返回的是整除之后的余数。
2.移位操作符
<< 左移操作符 >>右移操作符左移操作符移位规则:
左边抛弃、右边补0
右移操作符移位规则:
首先右移运算分两种
1.逻辑移位 左边用0填充,右边丢弃
2.算术移位 左边用原该值的符号位填充,右边丢弃
警告:
对于移位运算符,不要移动负数位,这个是标准未定义的。
例如:
int num = 10;
num >> -1;//error
3.位操作符
& 按位与
| 按位或
^ 按位异或
注: 他们的操作数必须是整数
小试牛刀(一道变态的面试题)
实例1:
不能创建临时变量(第三个变量),实现两个数的交换。
解法一:
#include <stdio.h>
int main()
{
int a = 10;
int b = 20;
a = a^b;
b = a^b;
a = a^b;
printf("a = %d b = %d\n", a, b);
return 0;
}
解法二:
如果不考虑溢出的话,倒是可以用这种方法求解
#include<stdio.h>
#include<stdlib.h>
int main()
{
int a = 10;
int b = 20;
a = a + b;
b = a - b;
a = a - b;
printf("a = %d b = %d\n", a, b);
system("pause");
return 0;
}
实例2:
求一个整数存储在内存中的二进制中1的个数。
基本思路就是遍历这个整数的每一个bit位,判断这个bit位是1还是0.如果是1,count++就行了。
基本思路
依次取1,10,100…这些数字和num进行按位与
取1运算时,相当于把num的最后一位取出来了
取10运算时,相当于把num的倒数第二位取出来了
#include<stdio.h>
#include<stdlib.h>
int countBit(int num)
{
int count = 0;
for (int i = 0; i < 32; i++)
{
if (num & (1 << i))
{
count++;
}
}
return count;
}
int main()
{
int num = 0;
scanf_s(" %d", &num);
int ret = countBit(num);
printf(" %d \n", ret);
system("pause");
return 0;
}
4.赋值操作符
赋值操作符是一个很棒的操作符,它可以让你得到一个你之前不满意的值。也就是你可以给自己重新赋值。
int weight = 120;//这个是初始化
weight = 89;//这个是赋值操作
注:
要明确区分赋值和初始化。
比如对于const修饰的变量,只能初始化,不能赋值
5.单目运算符
! 逻辑反操作
- 负值
+ 正值
& 取地址
sizeof 操作数的类型长度(以字节为单位)
~ 对一个数的二进制按位取反
-- 前置、后置--
++ 前置、后置++
* 间接访问操作符(解引用操作符)
(类型) 强制类型转换
注意:
sizeof不是函数,而是操作符。