=运算符====
运算符分类
目标操作数
1.单目运算符
int a = 5;
-a -5 ++a --a ~a a<< a>> &a * .....
!a
2.双目运算符
+ - * / | & % .....
a+b a-b
3.三目运算符(有且只有一个,条件运算符)
a?b :c;
a条件成立,执行b
否则执行c
int a = 100, b = 50;
a > b ? printf("a > b\n"):printf("a不大于b\n");
功能分类
1.算数运算符
+ - * / % ++ --。。。。
2.关系运算符
> < >= <= == !=
3.逻辑运算符(条件)
! && ||
!(条件1)
(条件1&&条件2)
(条件1||条件2)
4.位运算符 很重要!!!!
bit ,直接操作数据的二进制位,在硬件控制中,会大量使用
~ & | ^ >> <<
5.特殊的运算符
1.赋值运算符 =
a = 10; //从右往左进行赋值 =两边的数据类型得一致
a = b;
2.复合运算符
+= -= *= |= 。。。。。
3.条件运算符 (三目运算符)
4.sizeof 计算数据所占内存的大下
5.逗号运算符 ,
int a = 10, b = a;
int x =(a++,b++,a+b);
printf("a %d b %d x %d \n",a,b,x);//?
6.return 数值
在main函数中使用,结束main,结束整个程序
在其他函数使用,结束掉当前函数,数值就是当前函数的返回值
6.地址运算符
& *
& 取址符 &a 通过变量获取地址
* 取值符 (解引用) *地址 通过某个内存地址获取对应内存里面的数据
7.分量运算符 (结构体)
. ->
. 通过结构体变量访问结构体成员
->通过结构体指针访问结构体成员
部分运算符解析:
1.注意运算符的优先级
int a = 10, b = 20 ,c;
c = (a+b);
如果不知道使用的运算符优先级等级,可以使用括号表名想要先运算的对象
a+++++b 如果碰到类似于这种毫无意义的代码或者题目直接pass掉
2. / 如果计算的是两个整数,保存的位置是整数类型的,结果也是整数,没有小数部分
3. %(取余) 计算的是两个整数,结果也是整数
a%b a 和 b 得是整数 结果也是整数
4.使用 / % 进行数据分割
12 1 2
12/10 1
12%10 2
求123 各个位上的数据
123/100 1
(123/10)%10 12%10 2
123%10 3
5. ++ -- 应用
++变量自身加1
--变量自身减1
++ -- 即可以作为前缀 ,也可以作为后缀
前缀 ++a 先加再用
后缀 a++ 先用再加
6.自己写代码不要出现有歧义的语句
a+++++b+++c ?
a++;
b++;
c++;
a+b+c;?
7.关系运算符的结果只有两种
> < >= <= == !=
真 假
a>b 条件 条件成立 条件不成立
真 假
非0 0
if(条件表达式)
{
}
if(0)//假
{
}
if(1)//真
{
}
if(2)//真
{
}
if(-8)//真
{
}
8.逻辑运算符
! !(条件1) 非假既真 非真既假
&& (条件1&&条件2)
只有当条件1和条件2都成立时,整个条件才成立
|| (条件1||条件2)
只要两个条件中有一个成立,整个条件就成立
9.不要漏掉== 的等号
比较大小 == a==b
赋值 = a=b
10.复合运算符的应用
+= -= *= |= 。。。。。
当需要改变变量自身的值的时候经常用到
++ --
int a = 5;
a+=5;//等价于 a = a+5
11.使用=时,同一个表达式不能连续赋值
a=b=c;//错误的写法
a=b;
b=c;
c>b>a;//错误的写法
(b>a&&b<c)//正确的写法
12.强制类型转换
int a ;
float b = 12.34;
a = (int)b ;
练习
1.分析以下程序执行后的结果
int a = 12;
int b = a++;
int c = (a++,b++,a+b);
int d = ++a;
a++;
b++;
printf(“a %d b %d c %d d %d \n”,a,b,c,d);
最终a b c d的值
2.把1234的各个位的数单独计算出来
求123 各个位上的数据
123/100 1
(123/10)%10 12%10 2
123%10 3
1234 /1000 1
1234 /100 %10 12%10 2
1234 /10 %10 123 3
1234 %10 4
===位运算符 很重要!!!!=
1.嵌入式开发领域,可能接触到很多硬件
比如 51单片机 寄存器 操作配置引脚 8bit寄存器
位序 7 6 5 4 3 2 1 0
P0 – 0100 0000
P0 = 0X40;
2.在linux中,一般也需要直接操作内存,以达到操作硬件目的
也会大量用到位运算符
-
3.常见位运算符(针对于无符号整型数据)
- 按位取反 unsigned char a = 5 ;0000 0101 ~a 1111 1010
& 按位与 1&0 0 1&1 1 0&0 0
unsigned char a = 5
0000 0101 & 1010 1110 0000 0100
| 按位或 1|0 1 1|1 1 0|0 0
unsigned char a = 5
0000 0101 | 1010 1110 1010 1111
^ 按位异或 1^0 1 0^1 1 1^1 0 0^0 0
unsigned char a = 5
0000 0101 | 1010 1110 1010 1011
向右位移
1>>3 0001
<< 向左位移
1<<3 1000
应用场景:
1.对数据的某一位置零,其他位保持不变、
1010 0101 第5位置零 其他位不变
1010 0101
&
1101 1111 0010 0000 ~(1<<5)
1000 0101
a = a & (~(1<<5));
总结公式:
把a的第b位置零,其他位保持不变
a = a & (~(1<<b))
2.对数据的某一位置1,其他位保持不变
1010 0101 第6位置1 其他位不变
1010 0101
|0100 0000 1<<6
1110 0101
总结公式:
把a的第b位置1,其他位保持不变
a = a | (1<<b)
3.数据的切割
把二进制数据转换成16进制去切割
4bit的二进制数据对应 1个16进制位
1010 0101 0xA5
12 1 2
12/10 1
12%10 2
0XA5/(1<<4) 0XA
0XA5%(1<<4) 0X5
4.数据的拼接
把两个4bit的数据拼接成一个 8bit位的数据
0xA 0X5 --->0XA5
1 2 12 1*10+2
(0XA<<4)|0X5 0XA5