操作符
1、左移右移
左移:左边抛弃,右边补0
右移:(1)逻辑移位:左边用0填充,右边丢弃(2)算术移位:左边用原来该值的符号填充,右边丢弃。
正数的原码,反码,补码一样;负数反码为原码符号位不变,其他按位取反;补码为反码+1
int num = 10;
int b = num >> 1;
//num本身的值不会变
2、面试题:不创建其他变量,实现两个数交换
//方法1;会出现a+b太大导致溢出
#include "stdio.h"
int main(){
int a = 10;
int b = 20;
a = a + b;
b = a - b;
a = a - b;
printf("a = %d b = %d\n", a , b);
return 0;
}
//方法2;最优选择
#include "stdio.h"
int main(){
int a = 10;
int b = 20;
a = a^b;
b = a^b;
a = a^b;
printf("a = %d b = %d\n", a , b);
return 0;
}
3、单目操作符sizeof
sizeof计算变量大小可省略(),这证明sizeof是操作符不是函数。计算int类型不可以省略()
#include "stdio.h"
int main(){
short s = 5;
int a = 10;
printf("%d\n", sizeof(s = a+2));
printf("%d\n", s);
return 0;
}
sizeof(s = a+2)时判断到s是short类型就结束;sizeof的括号里不参与运算。况且s是早已经开辟了空间的,不会因为a是int就把s变成int,顶多将a+2削减为short
4、360面试题
#include "stdio.h"
int main(){
int i= 0,a = 0,b = 2,c = 3,d = 4;
i = a++ && ++b && d++;
printf("a = %d\n b = %d\n c = %d\n d = %d\n", a,b,c,d);
return 0;
}
a++先计算a再++;因为a是0,&看到0后面的就不运算了
5、逗号表达式
逗号表达式,从左向右依次执行。整个表达式的结果是最后一个表达式的结果
#include "stdio.h"
int main(){
int a = 1;
int b = 2;
int c = (a = b + 10, a, b = a + 1);
printf("%d\n", c);
return 0;
}
//>>c = 13