1 .算术操作符
假设变量 A 的值为 10,变量 B 的值为 20;
+ | 把两个操作数相加 | A + B 将得到 30 |
- | 从第一个操作数中减去第二个操作数 | A - B 将得到 -10 |
* | 把两个操作数相乘 | A * B 将得到 200 |
/ | 分子除以分母 | B / A 将得到 2 |
% | 取模运算符,整除后的余数 | B % A 将得到 0 |
注:
1. 除了 % 操作符之外,其他的几个操作符可以作用于整数和浮点数;
2. 对于 / 操作符如果两个操作数都为整数,执行整数除法。而只要有浮点数执行的就是浮点数除法;
3. % 操作符的两个操作数必须为整数。返回的是整除之后的余数;
实例:
intmain() { inta=21; intb=10; intc ; c=a+b; printf("Line 1 - c 的值是 %d\n", c ); c=a-b; printf("Line 2 - c 的值是 %d\n", c ); c=a*b; printf("Line 3 - c 的值是 %d\n", c ); c=a/b; printf("Line 4 - c 的值是 %d\n", c ); c=a%b; printf("Line 5 - c 的值是 %d\n", c ); c=a++; // 赋值后再加 1 ,c 为 21,a 为 22printf("Line 6 - c 的值是 %d\n", c ); c=a--; // 赋值后再减 1 ,c 为 22 ,a 为 21printf("Line 7 - c 的值是 %d\n", c ); return0}
结果如下:
Line1-c的值是31Line2-c的值是11Line3-c的值是210Line4-c的值是2Line5-c的值是1Line6-c的值是21Line7-c的值是22
2 .移位操作符
1)<< 左移操作符
2)>> 右移操作符
注:
移位操作符的操作数只能是整数
1. 左移操作符(<<)
移位规则:
左边抛弃、右边补0
2.右移操作符
首先右移运算分两种:
1. 逻辑移位
左边用0填充,右边丢弃
2. 算术移位
左边用原该值的符号位填充,右边丢弃
实例:
intmain() { unsignedinta=60; /* 60 = 0011 1100 */unsignedintb=13; /* 13 = 0000 1101 */intc=0; c=a<<2; /* 240 = 1111 0000 */printf("Line 5 - c 的值是 %d\n", c ); c=a>>2; /* 15 = 0000 1111 */printf("Line 6 - c 的值是 %d\n", c ); return0; }
结果如下:
Line5-c的值是240Line6-c的值是15
3. 位操作符
& // 按位与
| // 按位或
^ // 按位异或
注:
他们的操作数必须是整数
位运算符作用于位,并逐位执行操作 ,&、 | 和 ^ 的真值表如下所示:
p | q | p & q | p | q | p ^ q |
0 | 0 | 0 | 0 | 0 |
0 | 1 | 0 | 1 | 1 |
1 | 1 | 1 | 1 | 0 |
1 | 0 | 0 | 1 | 1 |
假设如果 A = 60,且 B = 13,现在以二进制格式表示,它们如下所示:
A = 0011 1100
B = 0000 1101
-----------------
A&B = 0000 1100
A|B = 0011 1101
A^B = 0011 0001
~A = 1100 0011
下表显示了 C 语言支持的位运算符。假设变量 A 的值为 60,变量 B 的值为 13,则:
运算符 |
描述 |
实例 |
& | 按位与操作,按二进制位进行"与"运算。运算规则: 0&0=0; 0&1=0; 1&0=0; 1&1=1; |
(A & B) 将得到 12,即为 0000 1100 |
| |
按位或运算符,按二进制位进行"或"运算。运算规则: 0|0=0; 0|1=1; 1|0=1; 1|1=1; |
(A | B) 将得到 61,即为 0011 1101 |
^ | 异或运算符,按二进制位进行"异或"运算。运算规则: 0^0=0; 0^1=1; 1^0=1; 1^1=0; |
(A ^ B) 将得到 49,即为 0011 0001 |
~ | 取反运算符,按二进制位进行"取反"运算。运算规则: ~1=-2; ~0=-1; |
(~A ) 将得到 -61,即为 1100 0011,一个有符号二进制数的补码形式 |
实例:
intmain() { unsignedinta=60; /* 60 = 0011 1100 */unsignedintb=13; /* 13 = 0000 1101 */intc=0; c=a&b; /* 12 = 0000 1100 */printf("Line 1 - c 的值是 %d\n", c ); c=a|b; /* 61 = 0011 1101 */printf("Line 2 - c 的值是 %d\n", c ); c=a^b; /* 49 = 0011 0001 */printf("Line 3 - c 的值是 %d\n", c ); c=~a; /*-61 = 1100 0011 */printf("Line 4 - c 的值是 %d\n", c ); return0; }
结果如下:
Line1-c的值是12Line2-c的值是61Line3-c的值是49Line4-c的值是-61