算数操作符
+ - * / %
1.除了 % 操作符之外,其他的几个操作符可以作用于整数和浮点数。
2.对于 / 操作符如果两个操作数都为整数,执行整数除法。而只要有浮点数执行的就是浮点数除法。
3.% 操作符的两个操作数必须为整数。返回的是整除之后的余数。
移位操作符(操作符是对补码进行操作)
右移操作符
>> 右移操作符 (算数操作符右边丢弃,左边补原来符号位)一般用这个 (逻辑右移右边丢弃,左边直接补0) 正整数原码反码补码相同 正整数15 原码为000000000000000000000000000001111; 反码为000000000000000000000000000001111; 补码为000000000000000000000000000001111; 负整数-15 原码为10000000000000000000000000001111; 反码为11111111111111111111111111110000;除了符号位不变其他为1变0,0变1; 补码为11111111111111111111111111110001;反码加1 -15>>1 补码为11111111111111111111111111111000; 反码为11111111111111111111111111110111; 补码减1(这里的减1是借前前一位的1相当于112-1,借1就是把这为变成2); 原码为10000000000000000000000000001000;反码除了符号位不变其他为1变0,0变1;
左移操作符
<<左移操作符 左移操作符 左边丢弃右边补0;
位操作符
#include <stdio.h> int main() { int a = 3; //补码00000000000000000000000000000011 int b = -5; //原码10000000000000000000000000000101 //反码11111111111111111111111111111010 //补码11111111111111111111111111111011 int c = a & b; //规则有0则0两个都是1才是1 //补码00000000000000000000000000000011 //补码11111111111111111111111111111011 //c 为00000000000000000000000000000011 printf("&操作符操作后%d\n", c); int n = a | b; //规则有1则1 //补码00000000000000000000000000000011 //补码11111111111111111111111111111011 //n补码为11111111111111111111111111111011 //n反码为11111111111111111111111111111010 //n原码为10000000000000000000000000000101 printf("|操作符操作后%d\n", n); int y = a ^ b; //规则对应二进制相同为0不同为1 //补码00000000000000000000000000000011 //补码11111111111111111111111111111011 //y补码为11111111111111111111111111111000 //y反码为11111111111111111111111111110111 //y原码为10000000000000000000000000001000 printf("^操作符操作后%d\n", y); system("pause"); }
关于^的一道面试题
问题为如何不创建临时变量交换两个数
a^a=a; a^0=0;//因为0的二进制补码全为0, a^b^a=b; a^a^b=b; //说明^有交换律
#include <stdio.h> int main() { int a = 1; int b = 2; 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); a = a ^ b; b = a ^ b;//将a带入b=(a^b)^b=a a = a ^ b;//将a和b带入a=(a^b)^a=b printf("再次交换后a=%d b=%d\n", a, b); system("pause"); }
复制操作符
合赋值符 += -= *= /= %= >>= <<= &= |= ^=
单目操作符
! 逻辑反操作 - 负值 + 正值 & 取地址 sizeof 操作数的类型长度(以字节为单位) ~ 对一个数的二进制按位取反 -- 前置、后置-- ++ 前置、后置++ * 间接访问操作符(解引用操作符) (类型) 强制类型转换
演示代码: 关于sizeof其实我们之前已经见过了,可以求变量(类型)所占空间的大小。 #include <stdio.h> int main() { int a = -10; int *p = NULL; printf("%d\n", !2); printf("%d\n", !0); a = -a; p = &a; int arr[10]={0}; printf("%d\n", sizeof(a)); printf("%d\n", sizeof(int)); printf("%d\n", sizeof a);//这样写行不行?行括号能去掉说明不是函数 printf("%d\n", sizeof int);//这样写行不行? printf("%d\n", sizeof(arr));//特殊的数组名代表整个数组大小 printf("%d\n", sizeof(int [10])); return 0; }
~操作符代码演示
#include <stdio.h> int main() { int a = 10; //补码00000000000000000000000000001010 //取反11111111111111111111111111110101 //反码11111111111111111111111111110100 //原码10000000000000000000000000001011 printf("%d", ~a);//-11; system("pause"); }
小问题
```c #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)两个地方分别输出多少?
关系操作符
> >= < <= != 用于测试“不相等” == 用于测试“相等”
自行理解