Linux编程之C语言
1、赋值运算符
^= 异或后赋值
a ^=b === a=a^b;
位操作符
位异或 ^
按二进制位进行比较,如果对应位不相同就为1, 相同就为0
如 unsigned char val = 10;
val ^ 0x01 ==》 0000 1010
^ 0000 0001
0000 1011
unsigned char a = 0x12;
unsigned char b = 0xab;
unsigned char c = a^b ; ===> ?
unsigned char d = c^b ; ===> ?
unsigned char e = c^d ;
见图
2、作用:1)用来比较全部位数是否相同,只有有一位不相同返回的就是非0;
如果全部位都相同 返回0;
2)可以实现两数交换
unsigned char a = 0x12;
unsigned char b = 0xab;
a = a^b ;// 新的a值为 0xb9
b = a^b; // 新b为0x12
a = a^b;// 新a为0xab
还可以写成:
a^=b;
b^=a;
a^=b;
3、思考: 要实现两数的交换,可以想到几种方式?用代码确定效果 (3~~4种)
int a = 0x12;
int b = 0xab;
1) 异或
a^=b ;
b^=a;
a^=b;
2) 使用额外变量暂存
int temp ;
temp = a ;
a = b ;// 把b的值赋给a
b = temp ; // 把之前a的值赋给b
3) 利用加减法
a = a+b;
b = a-b;
a = a-b;
4) 利用乘除法
a = a*b;
b = a/b;
a = a/b;
4、如果在同一个表达式中, 对同一个变量进行了多次赋值, 结果是undefined的, 没有定义, 因为这个结果是有编译器的处理方式决定的
5、位反 ~
把数据的每一位都取反 (注意不是反码)
char val = 100; // 0x64
~val ==> ~0110 0100 ==》 1001 1011
常和位与、位或操作配合使用
例:要保证val的第3位为0
val & 0b11110111 ====== val &( ~0x08 )
6、其它运算符
sizeof() 计算对应的类型或者是变量所占用的空间大小,以字节为单位
printf( “int is %ld Btyet(s) \n”, sizeof(int)) ;
int a ;
printf( “int is %ld Btyet(s) \n”, sizeof(a))
确认所有基本数据类型所占用的空间大小
char 1
short 2
int 4
float 4
long 8
double 8
long double 16
bool 1 <stdbool.h>
常用于数组的大小、结构体等类型大小
? : C语言唯一的三目运算符
判断条件 ?条件为真时执行的语句 : 条件为假时执行的语句
例子:用一个表达式得到a和b中比较大的值
a>b ? a : b
a大于b吗?如果是则a : 否则b
就是 if ... else....的精简版
if(a>b)
max = a;
else
max = b;
7、练习:定义三个同类型变量a,b,c 分别赋值;
通过一个表达式得到最大值,并打印出来
,
int a = (100 , 200);
最终a的值是200,因为()最后为200
运算符的优先级:(对应<C语言运算符优先级.pdf>)
[ ] ( )
单目运算符
双目算术运算符和<< >>
双目关系运算符
双目位运算 ( i & 0x01) == 0
双目逻辑运算
三目运算符
赋值运算符
8、补充及练习:如图