少年不惧岁月长,彼方尚有荣光在。
十八,操作符
1.操作符分类:
·算术操作符
·移位操作符
·位操作符
·赋值操作符
·单目操作符
·关系操作符
·逻辑操作符
·条件操作符
·逗号表达式
·下标引用、函数调用和结构成员
2.算术操作符
+ - * / %
/:
1)整型的除法 1/2=0
2)浮点型的除法 1.0/2=0.5(1/2.0和1.0/2.0都执行小数除法)
%(取模操作符的两端必须是整数):
计算的是整除之后的余数
3.移位操作符 (移位操作符的操作数只能是整数,且移位操作符移动的是二进制)
关于二进制:
整数的二进制表示有三种
1)原码
2)反码
3)补码
正整数的原码,反码,补码相同;
负整数的原码,反码,补码是要计算的。
eg. 数字7(一个整型4个字节,32个比特位)
原码:(最高位为符号位,0表示正数,1表示负数)00000000000000000000000000000111
反码:00000000000000000000000000000111
补码:00000000000000000000000000000111
数字-7
原码:10000000000000000000000000000111
反码:11111111111111111111111111111111000 (符号位不变,其他位按位取反就是反码)
补码:11111111111111111111111111111111001 (反码+1就是补码)
整数在内存中存储的是补码。
· << 左移操作符:左边丢弃,右边补0
正数:
负数:(比正数多一步,需要求出原码)
· >> 右移操作符
1)算术移位:右边丢弃,左边补原符号位
2)逻辑移位:右边丢弃,左边补0
正数:
负数:
使用哪种右移取决于编译器,VS使用算术右移。
(警告:对于移位操作符,不要移动负数位,这个是标准未定义的。)
4.位操作符 (操作数必须是整数)
· & :按(二进制)位与 同时为1结果才为1,否则结果为0
· | :按(二进制)位或 同时为0结果才为0,否则结果为1
· ^ :按(二进制)位异或 相同为0,相异为1
一道相关的面试题:不能创建临时变量(第三个变量),实现两个数的交换
1.这种方法可能会存在溢出现象,有一定潜在的问题
#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;
}
2.(^只适用于两个整数之间进行交换)
^:
1)两个相同的数字按位异或的结果为 0 --->a^a=0
2) 0按位异或一个整数的结果为该整数 --->0^a=a
3) 按位异或支持交换律 ---> 3^3^5=5 3^5^3=5
#include <stdio.h>
int main()
{
int a = 3;
int b = 5;
printf("交换前:a=%d b=%d\n", a, b);
a = a ^ b;//a=3^5
b = a ^ b;//b=3^5^5=3
a = a ^ b;//a=3^5^3=5
printf("交换后:a=%d b=%d\n", a, b);
return 0;
}