目录
一、算数操作符
+ — * / %
对于 / ,两边都是整数,则结果为整数;两边只要有一个浮点数,则结果为小数
二、移位操作符
<< 左移操作符
>> 右移操作符
注:移(2进制)位操作符的操作数只能是整数
补充:二进制(基础)
整数的二进制表示形式有3种:原码,反码,补码
按照一个数的正负,直接写出它的二进制序列得到的就是原码
1).正数
10的二进制表示形式为1010,12=(1*2^3)+(1*2^2)+(0*2^1)+(0*2^0)
一个整型占4个字节(32bit)
在创建变量时,一个整型的形式应写成32位
正数的原码,反码,补码是相同的
int a = 10;
原码——00000000000000000000000000001010
反码——00000000000000000000000000001010
补码——00000000000000000000000000001010
2).负数
正数的原码,反码,补码需要经过计算
int b = -10;(第一个位置是符号位,0—正,1—负)
原码——10000000000000000000000000001010
符号位不变,其他位(除了符号位)按位取反,就是反码
反码——11111111111111111111111111111110101
反码加1,就是补码
补码——11111111111111111111111111111110110
(补充:若变量为无符号数(unsigned int),则负数的符号位不会被当作符号位,而是正常数字)
移位操作符
内存中存储的是:补码的二进制
参与移位的,移动后的都是补码,需要进行计算得到结果
左移操作符
正数,负数——左边丢弃,右边补0
num<<1的结果是移位之后的效果,这个过程中num不变
右移操作符
1. 逻辑右移:左边用0填充,右边丢弃
2. 算术右移:左边用原该值的符号位填充,右边丢弃(多数)
(由编译器决定方式)
-1的补码为11111111111111111111111111111111
三、位操作符
对各个二进制位
& 按位与——有0则为0,都为1则为1
| 按位或——有1则为1,都为0则为0
^ 按位异或——不同为1,相同为0
~ 按位取反——各个位取反
注:操作数只能是整数(也是以内存所存形式(补码)进行计算)
例题:不能创建临时变量,实现两个整数的交换。
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^4^5=3^5^4)
四、单目操作符
! ++ -- & * + - ~ sizeof
! 逻辑非运算符
若表达式a为真,则!a为假;反之相同
补充:布尔类型(C99)
C99标准引入了_Bool类型,并且在头文件<stdbool.h>中定义了bool宏,它是_Bool的别名,同时定义了true和false宏,分别代表1和0,方便进行布尔值的操作和判断。
布尔函数,只返回ture或false
bool is_leap_year(int y)
{
if (((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0))
return true;
else
return false;
}
++、-- 前置:先赋值,再运算
后置:先运算,再赋值
& 取地址
* 间接访问操作符(解引用操作符)
五、逗号表达式
exp1, exp2, exp3, …expN
逗号表达式,就是用逗号隔开的多个表达式
从左向右依次执行,整个表达式的结果是最后⼀个表达式的结果