如果不创建临时变量(第三个变量),可以实现两个整数的交换吗?
回答是可以的
方法一:
#include<stdio.h> int main() { int a = 3; int b = 5; a = a + b; b = a - b; a = a - b; printf("交换前:a=%d b=%d\n", a, b); printf("交换后:a=%d b=%d\n", a, b); return 0; }
🍤 运行结果:
方法二:使用 ^ 操作符实现
#include<stdio.h> int main() { int a = 3; int b = 5; printf("交换前:a=%d b=%d\n", a, b); a = a ^ b; b = a ^ b; a = a ^ b; printf("交换后:a=%d b=%d\n", a, b); return 0; }
🍤 运行结果:
异或操作符也支持交换律
例如:
//a^a -> 0 //a^0 = a #include<stdio.h> int main() { int a = 3; int b = 5; int c= a^b^a; int d= a^a^b; printf("%d %d\n", c, d); return 0; }
🍤 图解:
a ^b ^a=b
同样地,a^a^b=a
🍤 运行结果:
实例2:求一个整数存储在内存中的二进制中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; }
//方法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. 赋值操作符
赋值操作符是一个很棒的操作符,他可以让你得到一个你之前不满意的值。也就是你可以给自己重新赋值。
int weight = 120;//体重 weight = 89;//不满意就赋值 double salary = 10000.0; salary = 20000.0;//使用赋值操作符赋值
赋值操作符可以连续使用
例如:
int a = 10; int x = 0; int y = 20; a = x = y+1;//连续赋值
这样的代码感觉怎么样?
那同样的语义,你看看:
x = y+1; a = x;
可见,下面的写法更加清晰爽朗而且易于调试。
复合赋值符
+= -= *= /= %= >>= <<= &= |= ^=
这些运算符都可以写成复合的效果。
例如:
int x = 10; x = x+10; x += 10;//复合赋值,与上面等式等价 //但下面复合语句明显更加简洁。
其他运算符也是一样的道理。
6. 单目操作符
6.1 单目操作符介绍
! 逻辑反操作 - 负值 + 正值 & 取地址 sizeof 操作数的类型长度(以字节为单位) ~ 对一个数的二进制按位取反 -- 前置、后置-- ++ 前置、后置++ * 间接访问操作符(解引用操作符) (类型) 强制类型转换
🍩单目操作符只有一个操作数
实例1: !
// ! 操作符 //非 0 为真 #include<stdio.h> int main() { int flag = 5; if (flag == 0) { printf("hehe\n"); } if (!flag)//这里当 flag 为假时,才会打印hehe { printf("hehe\n"); } if (flag) { printf("haha\n"); } return 0; }
🍤 运行结果:
实例2: -
// - 操作符 #include<stdio.h> int main() { int a = 5; int b = -a; printf("%d\n", b); return 0; }
🍤 运行结果:
实例3: &
// & * 操作符 #include<stdio.h> int main() { int a = 10; //pa是指针变量 int* pa = &a;//&-取地址操作符-取出a的地址 *pa = 20;//解引用操作符(间接访问操作符)-单目操作符-通用pa中存放的地址,找到指向的空间(内容) //同时也更改了a 的内容 int c = *pa; printf("a=%d c=%d\n",a, c); return 0; }
🍤 运行结果: