运算符和表达式
运算符类别 | 运算符 |
---|---|
算数运算符 | +、-、*、/、%(求余只能在整数间进行) |
关系运算符 | >、<、==、>=、<=、!= |
逻辑运算符 | !、&&、|| |
条件运算符 | ?、: |
逗号运算符 | , (顺序求值,最后一个表达式的值为最终值) |
指针运算符 | *、& |
分量运算符 | .-> |
赋值运算符 | =(注意类型转换,默认低类型向高类型转换) |
下标运算符 | [] |
自增、自减运算符 | ++、--(前置先增减,后运算,后置则相反;只能用于变量) |
求字节数运算符 | sizeof(type|x) (变量或数据类型在内存中所占的字节数) |
位运算符 | &、|、^、<<、>>、~ |
强制类型转换运算符 | (type) |
其他 | 函数调用 () |
算术运算和类型转换
基本的算术运算符
加减乘除及求余运算符。
两个整型数据相除的结果只能为整型(舍去小数部分),如果想得到实数结果,必须用实型数据相除。
如果除数或被除数有一个为负数,则舍入的方向未作明确规定。
所有实数默认是按double进行计算。
求余运算只能在两个整型数据之间进行。
算术运算中的类型转换
C语言要求参与某种运算的两个运算量之间必须具有相同的数据类型。
- 自动转换:如果两个运算量的数据类型不一致,则系统将会将其中的一个低级别类型数据向另一个高级别的数据转换。
- 强制类型转换:(data type) (expression)
赋值运算中的类型转换
将实型数据赋给整型变量时,直接舍弃小数部分。
将整型数据赋给实型变量时,数值不变,但以浮点型形式在内存中存储。
将double型数据赋给float变量时,截取其前面的7位有效数字。
将整型(含char)数据赋值给另一个取值范围更大的整型变量时,分两种情况:
- 对于一个有符号的整型数据,用其符号位的值向前扩展。
- 对于一个无符号的整型数据,则只能用0向前扩展。
将整型(含char)数据赋值给另一个取值范围更小的整型变量时,按后者的位数,直接取其最低位的二进制数据。
同等长度的整型数据和无符号型整型数据之间的转换,是直接按照内存单元中的存储原样照搬。
位运算
位运算符只能用于整型变量,不能用于浮点型变量。
除了取反(~)运算符外,其余都是双目运算符。
负数以内存中存储的补码形式参加位运算。
运算符 | & | | | ^ | ~ | << | >> |
---|---|---|---|---|---|---|
操作 | 按位与 | 按位或 | 按位亦或 | 取反 | 左位移 | 右位移 |
按位与“&”
运算规则:如果两个数的相应的二进制位都位1,则该位的结果值为1,否则为0。
"&"运算经常用于取出一个二进制数的若干位。如有一个整型数i,它占2个字节16位。若想取其低字节8位,可用i&255。
按位或“|”
运算规则:如果两个数的相应的二进制位中有一个为1,则该位的结果为1,否则为0。
"|"运算经常用于将一个二进制数的某些位置为1。如有一个整型数据i,将其低字节8位置1,可用i|255。
按位异或”^“
运算规则:如果两个数的相应的二进制位相同,则结果为0,不同则为1.
"^"运算经常用于将一个二进制数的指定若干位取反。如有一个整型数据i,将其低字节8位取反,可用i^255。
取反“~”
运算规则:将一个二进制数按位取反,即将0变为1,1变为0。
左位移“<<“
运算规则:将一个数的各二进制位全部左移若干位,高位左移之后舍弃不用,低位补0。
右位移
运算规则:将一个数的各二进制位全部右移若干位,低位右移之后自动舍弃,而移入的高位则与符号有关。
- 如果是无符号数,高位移入0;
- 如果是有符号正整数(最高位为0),高位移入0;
- 如果是有符号负整数(最高位为1),则取决于所用的计算机系统。高位移入0称为逻辑右移,移入1称为算术右移。
不同长度整型数据之间的位运算
运算规则:若两数的二进制位长度不同,系统会将两者的按右端对齐,左端补齐0或1。
- 如果为正数,则左端补满0。
- 如果为负数,则左端补满1。
赋值运算
赋值运算符可以和算术运算符及位运算符之间组成复合赋值运算符。
如a+=b,为a=a+b。
如a&=b,为a=a&b。