C语言操作符
算术操作符
+ 可以作用于整数和浮点数
- 可以作用于整数和浮点数
* 可以作用于整数和浮点数
/ 如果两个操作数都为整数,执行整数除法。只要有浮点数,就执行浮点数除法
% 两个操作数必须为整数。返回的是整除之后的余数
移位操作符
<< 左移操作符 左边抛弃,右边补0 左移一位相当于给该值*2
>> 右移操作符 右移一位相当于给该值/2
逻辑移位:左边用0填充,右边丢弃
算术移位:左边用原该值的符号位填充,右边丢弃
不要移动负数位,这是标准未定义的
位操作符
& 按位与 都为1时为1
| 按位或 都为0时为0
^ 按位异或 相同为0,不同为1
逻辑操作符
&& 逻辑与 进行&&运算的时候如果左侧表达式为0,那么右侧表达式不计算
|| 逻辑或 进行||运算的时候如果左侧表达式为1,那么右侧表达式不计算
赋值操作符
= 赋值操作符可以给一个变量赋初值,也可以重新赋值
赋值操作符可以连续使用,如:a=x=y+1; 但不简单明了,所以不建议使用
复合操作符 +=、-=、*=、/=、%=、>>=、<<=、&=、|=、^=
如:x&=y <=>x=x&y
下标引用,函数调用和结构成员
[] 下标引用操作符 操作数:数组名[索引值]
() 函数调用操作符 接受一个或多个操作数:第一个操作数是函数名,剩余的操作数就是传递给函数的参数
访问一个结构的成员 . 结构体.成员名 -> 结构体指针->成员名
(*pstu).age等同于pstu->age
逗号表达式
逗号表达式,就是用逗号隔开的多个表达式。用逗号表达式,从左到右依次执行。整个表达式的结果是最后一个表达式的结果
除了在for循环中有意义,还没发现它有意义的地方
条件操作符
exp1 ? exp2 : exp3
if(x>y){return x; }else return y;
等同于
return x>y ? x : y
表达式求值
表达式求值的顺序一部分是由操作符的优先级和结合性决定。有些表达式的操作数在求值的过程中可能需要转换为其他类型
C的整型算术运算总是至少以缺省整型类型的精度来进行的。为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整形,这种转换称为整形提升
负数的整形提升:高位补充符号位,即为1 正数的整形提升:高位补充符号位,即为0
如果某个操作符的各个操作数属于不同的类型,那么除非一个操作数的转换为另一个操作数的类型,否则操作就无法进行。
寻常算术转换 long double double float unsigned long int long int unsigned int int
如果某个操作数的的类型在上面这个列表中排名较低,那么首先要转换为另外一个操作数的类型后执行运算。
算术转换要合理,不然会有一些潜在问题。如,精度丢失
复杂表达式的求值有三个影响的因素 1.操作符的优先级 2.操作符的结合型 3.是否控制求职顺序
两个相邻的操作符先执行哪个取决于它们的优先级。如果两者的优先级相同,取决于它们的结合型
不要在一个表达式中对一个变量修改多次。在有歧义的地方多使用(),防止预期结果出错
关系操作符
> 大于
>= 大于等于
< 小于
<= 小于等于
!= 不等于
== 等于
单目操作符
! 逻辑反操作 真变假,假变真
- 负值
+ 正值
& 取地址
sizeof 操作数的类型长度(以字节为单位)
~ 对一个数的二进制按位取反
-- 前置、后置--
++ 前置、后置++
++n 返回值是自增之后的值 n++ 返回值是自增之前的值
* 间接访问操作符(解引用操作符)
(类型) 强制类型转换