- 算术操作符
- 移位操作符
- 位操作符
- 赋值操作符
- 单目操作符
- 关系操作符
- 逻辑操作符
- 条件操作符
- 逗号操作符
- 下标引用,函数调用和结构成员
一般分为五种:+ - * / %
#define _CRT_SECURE_NO_WARNINGS 1 #include移位操作符int main() { int a = 1+1; // + printf("和是%dn", a); int b = 2 - 1; // - printf("差是%dn", b); int c = 2 * 2; // * printf("积是%dn", c); float d = 6.0 / 5; // 1:/ printf("a=%fn", d); float e = 6 / 5.0; // 2:/ printf("b=%fn", e); float f = 6.0 / 5.0; // 3:/ printf("c=%fn", f); float g = 6.0f / 5.0f; // 4:/ printf("d=%fn", g); return 0; }
移位操作符是以二进制来算的
- <<左移操作符
- >>右移操作符
把整数 2 左移一位得( )?
x86是32位,x64是64位,这里以32位算
首先把 2 换算成二进制:
00000000000000000000000000000010,按照左移移出位舍弃,空位添0,那么是这样的
0000000000000000000000000000010,最左边舍弃一位(可以拿尺子比一下),最右边少了一位所以右边加一个0得:
00000000000000000000000000000100,换算为十进制是 4,所以括号处填 4
把整数 4 右移一位得( )?
首先把 4 换算成二进制:
00000000000000000000000000000100,按照右移移出位舍弃,空位添0,那么是这样的
0000000000000000000000000000010,最右边舍弃一位(可以拿尺子比一下),最左边少了一位所以左边加一个0得:
00000000000000000000000000000010,换算为十进制是 2,所以括号处填 2
原码,反码,补码
原码:整数的二进制位
反码:符号位不变,其他位按位取反 (最高位“1”为负数,“0”为正数)
补码:反码+1
比如:
原码:10000000000000000000000000000001 -1的二进制
反码:11111111111111111111111111111110 取反
补码:11111111111111111111111111111111 反码+1
所以 -1 的的补码是 0
算术右移补原符号位,逻辑右移补0
位操作符& 按位与 按(2进制)位与 0+1=0 1+1=1
| 按位或 按(2进制)位或 0+1=1 1+1=1
^ 按位异或 按(2进制)位异或 相同为0,相异为1
按位与
#define _CRT_SECURE_NO_WARNINGS 1 #includeint main() { int a = 3; int b = 5; int c = a & b; printf("c = %d", c); return 0; }
3 = 00000000000000000000000000000011
5 = 00000000000000000000000000000101
c = a & b = 00000000000000000000000000000001
结果c = 1
按位或
#define _CRT_SECURE_NO_WARNINGS 1 #includeint main() { int a = 3; int b = 5; int c = a | b; printf("c = %d", c); return 0; }
3 = 00000000000000000000000000000011
5 = 00000000000000000000000000000101
c = a | b = 00000000000000000000000000000111
结果c = 7
按位异或
#define _CRT_SECURE_NO_WARNINGS 1 #includeint main() { int a = 3; int b = 5; int c = a ^ b; printf("c = %d", c); return 0; }
3 = 00000000000000000000000000000011
5 = 00000000000000000000000000000101
c = a ^ b = 00000000000000000000000000000110
结果c = 6
例题:有两个整数 3 和 5 ,在不创建第三个变量的情况下交换位置。
#define _CRT_SECURE_NO_WARNINGS 1 #includeint main() { int a = 3; int b = 5; printf("交换前a=%d b=%d", b, b); a = a + b; //3=3+5 b = a - b; //5=3-5 a = a + b; //3=3+5 printf("交换后a=%d b=%d", b, b); //结果:交换前a=3 b=5 //交换后a=5 b=3 return 0; }
这种方法有bug,数值太大会溢出!!!
可以选择这种方法:异或一下
#define _CRT_SECURE_NO_WARNINGS 1 #includeint main() { int a = 3; int b = 5; printf("a=%d b=%d", a, b); a = a ^ b; b = a ^ b; a = a ^ b; printf("a=%d b=%d", a, b); return 0; }
所以这种方法更为简便,同样可以不创建第三个变量交换位置



