目录
一.操作符分类:
1.算术操作符:
2.移位操作符:
(移位操作符操作的对象只能是整数)
a.左移操作符
移位规则:左边抛弃 右边补0
b.右移操作符
移动规则:
1.逻辑移位:左边用0填充 右边丢弃
2.算术移位:左边用符号位填 右边丢弃
关于移位操作符:不要移动负数位 这个是标准未定义的
例如:int num = 1; num>> - 1 //error
3.位操作符
一道变态的面试题: 不能创建临时变量(第三个变量) 实现两个数的交换
#include<stdio.h>
int main(void)
{
int a = 10;
int b = 20;
a = a ^ b;
b = a ^ b;
a = a ^ b;
printf("%d %d\n",a,b);
return 0;
}
编写代码实现:求一个整数存储在内存中的二进制中1的个数
//最普通最原始的方法
#include <stdio.h>
/*int main(void)
{
int k = 0;
printf("the founded number :");
scanf("%d",&k);
int count = 0;
while(k)
{
if(k%2 == 1)
count++;
k = k/2;
}
printf("%d\n",count);
return 0;
}*/
//进阶版 使用移位操作符
/*int main(void)
{
int k = 0;
printf("the founded number :");
scanf("%d",&k);
int count = 0;
int i = 0;
for(i=0;i<32;i++)
{
if(k & 1<<i)
count++;
}
printf("%d\n",count);
return 0;
}*/
//进阶版要循环32次太麻烦那么最优解出现啦
int main(void)
{
int k = 0;
printf("the founded number :");
scanf("%d",&k);
int count = 0;
while(k)
{
k = k & (k-1);
count ++;
}
printf("%d\n",count);
return 0;
}
4.赋值操作符
当你对一个变量的值不满意时 你可以自行给这个变量赋予你想要的值
5.单目操作符
关于sizeof其实我们之前已经见过了,可以求变量(类型)所占空间的大小
关于++/--运算符:前置++/--是先++/--再使用 而 后置++/--是先使用这个值后再++/--
6.关系操作符
“=”是赋值 把一个值赋予给一个变量 而 “==”用于判断是否左右相等
7.逻辑操作符
&& 逻辑与:主要判断左右两边的逻辑的“与”
& 按位与:主要是用来计算左右两边的“与”(左右相同返回1)
|| 逻辑或:主要判断左右两边的逻辑的”或“
| 按位或: 主要是用来计算左右两边的”或“(有一个1就返回1)
#include <stdio.h>
int main() {
int i = 0,a=0,b=2,c =3,d=4;
i = a++ && ++b && d++;//1 2 3 4 0
i = a++||++b||d++;// 1 3 3 4 1
printf("a = %d\n b = %d\n c = %d\nd = %d\ni = %d", a, b, c, d,i);
return 0;
}
8.条件操作符
exp1? exp2 : exp3
当exp1 表达式为1 时 返回 exp2 否则返回 exp3
9.逗号表达式
10.下标引用 、函数调用和结构成员
a.[ ] 下标引用操作符
操作数:一个数组名 + 一个索引值
b. ( ) 函数调用操作符
接受一个或者多个操作数:第一个操作数是函数名 剩余的操作数就是传递给函数的参数
c.访问一个结构的成员
. 结构体.成员名
-> 结构体指针->成员名
二.表达式求值
表达式求值的顺序一部分是由操作符的优先级和结合性决定 同样 有些表达式的操作数在求值的过程中可能需要转换为其他类型。
1.隐式类型转换
C的整型算术运算总是至少以缺省整型类型的精度来进行的
为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升
2.算术转换
如果某个操作符的各个操作数属于不同的类型 那么除非其中一个操作数的转换为另一个操作数的类型 否则操作就无法进行 下面的层次体系称为寻常算术转换
如果某一个操作数的操作符在列表中的级别较低 那么就要转换为另一个操作数的类型后才能运算当然 算数转换一定要合理 不然就会存在一些潜在的问题 例如从float 转换成 int 就会丢失精确度
3.操作符的属性
操作符的优先级:
问题表达式:
a*b + c*d + e*f *的优先级比+高 但是只是说“a*b”比“b+c”先 但是优先级并不能决定第三个*比第一个+早执行
关于总结: 我们写出的表达式如果不能通过操作符的属性确定唯一的计算路径 那这个表达式就是存在问题的