操作符
算数操作符
+ , - , * , / , %
注:除%之外,其余操作符既适用于浮点类型也适用于整形。
位操作符
& , | , ^ (AND,OR,XOR)
位的操纵
- 将指定的二进制位设置为1
value = value | 1 << bit_number; value |= 1 << bit_number;
- 将制定的二进制位清01 ,即求补,对应位0变1,1变0
value = value & ~(1 << bit_number);
这里我们来看一个题目,计算参数二进制中1的个数
int count_one_bits1(size_t value)
{
int ones;
for (ones = 0; value != 0; value = value >> 1)
{
if (value % 2 == 0)
ones = ones + 1;
}
return ones;
}
int count_one_bits2(size_t value)
{
int ones;
for (ones = 0; value != 0; value >>= 1)
{
if ((value & 1) != 0)
ones += 1;
}
return ones;
}
注:这里我们可以看到两个函数实现了一样的功能,但是显然函数2要比函数1更加简洁,这是因为函数二我们运用了关系操作符和复合赋值符。
关系操作符
> , >= , < , <= , != , ==
复合赋值符
+= , -= , *= , /= , %=
<<= , >>= , &= , ^= , |=
逻辑运算符
区别于位运算符
|| , &&
条件运算符
expression1 ? expression2 : expression3
逗号运算符
- 分隔各个表达式,表达式从左向右依次求值,整个表达式的结果是最后一个表达式的值。
左值与右值
- 注:表达式的左值必须表示一个可以存储结果值的地点,且表达式的左值必须是可以修改的,因此字面值常量不可以做左值。
类型转换
隐式类型转换
- 整形提升,C语言中整形算数运算总是至少以缺省整型类型的精度来进行,字符型和短整型操作数在使用前被转换为普通整型,再进行计算。
算数类型转换
- 若是两个操作数的类型不同,在类型列表中排名低的会先转换为另一个操作数的类型,再执行操作。
举个例子
eg:
int a = 500;
int b = 5;
long c = a * b; 此时会存在类型转换,long c = (long)a * c;
操作符的优先级