1.操作符分类
算术操作符 + - * / %
移位操作符 >> <<
位操作符 & ^ |
赋值操作符 = += *=......
单目操作符 ! sizeof ++ --
关系操作符 > >= <= != ==
逻辑操作符 && ||
条件操作符 ? :
逗号表达式 ,
下标引用、函数调用和结构成员 [] () . ->
2.算术运算符
+ - * / %
1. 除了 % 操作符之外,其他的几个操作符可以作用于整数和浮点数。
2. 对于 / 操作符来说,如果两个操作数都为整数,执行整数除法。而只要有浮点数执行的就是浮点数除法。
3. % 操作符的两个操作数必须为整数。返回的是整除之后的余数。
3.移位操作符
>> 右移操作符
<< 左移操作符
注:移位操作符的操作数只能是整数。
3.0二进制讲解
移位操作符涉及到二进制数,于是先讲讲二进制
口诀:原码取反加1得补码,补码取反加1得原码。
3.1左移操作符
移位规则:左边抛弃,右边补0。
理解了左移的规则之后,再理解右移就容易了。
3.2右移操作符
移位规则(右移运算分两种):
1. 逻辑移位
右边直接丢弃,左边直接补0。
2. 算术移位
右边直接丢弃,左边用该值原来的符号位(二进制表示中最左边那一位数)填充。
即原来是负数,左边补1;原来是正数,左边补0。
警告⚠:
对于移位运算符,不要移动负数位,这个是标准未定义的。
例如:
int num = 10;
num>>-1;//error
4.位操作符
& | ^ | //按位与 //按位或 //按位异或 |
注:他们的操作数必须是整数。
4.1 按位与
3与-5的补码上下对应着看。
按位与:只要有0就为0,两个同时为1才为1。
输出结果:3
4.2 按位或
或运算:有1就为1,同时为0就为0。
输出结果:-5
按位异或
异或运算:相同为0,互异为1。
此处c的值为-8。
练习:
编写代码实现:求一个整数存储在内存中的二进制中1的个数。
参考代码:
//方法1
#include <stdio.h>
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:
#include <stdio.h>
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;
}
//思考还能不能更加优化,这里必须循环32次的。
//方法3:
#include <stdio.h>
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;
}
//这种方式是不是很好?达到了优化的效果,但是难以想到。
5.赋值操作符
=
该操作符可以让你换成你满意的值,即重新赋值。
6.单目操作符
6.1单目操作符的介绍
! - + & sizeof ~ -- ++ | 逻辑反操作 负值 正值 取地址 操作数的类型长度(以字节为单位) 对一个数的二进制按位取反 前置、后置-- 前置、后置++ |
* 间接访问操作符(解引用操作符)
(类型) 强制类型转换
6.2 sizeof与数组
sizeof可求变量(类型)所占空间的大小。
#include <stdio.h>
void test1(int arr[])
{
printf("%d\n", sizeof(arr));//(2)
}
void test2(char ch[])
{
printf("%d\n", sizeof(ch));//(4)
}
int main()
{
int arr[10] = {0};
char ch[10] = {0};
printf("%d\n", sizeof(arr));//(1)
printf("%d\n", sizeof(ch));//(3)
test1(arr);
test2(ch);
return 0;
}
问:
(1)、(2)两个地方分别输出多少?
(3)、(4)两个地方分别输出多少?
//++和--运算符
//前置++和--
#include <stdio.h>
int main()
{
int a = 10;
int x = ++a;
//先对a进行自增,然后对使用a,也就是表达式的值是a自增之后的值。x为11。
int y = --a;
//先对a进行自减,然后对使用a,也就是表达式的值是a自减之后的值。y为10;
return 0;
}
//后置++和--
#include <stdio.h>
int main()
{
int a = 10;
int x = a++;
//先对a先使用,再增加,这样x的值是10;之后a变成11;
int y = a--;
//先对a先使用,再自减,这样y的值是11;之后a变成10;
return 0;
}