C语言操作符总结
C语言提供了品种繁多的操作符,今天做一个简要的总结。为了便于了解及使用,按照操作符的功能或者使用方式对其进行了分类。主要分为:算术操作符、移位操作符、位操作符、赋值操作符、单目操作符、关系操作符、逻辑操作符、条件操作符、逗号表达式、下标引用、函数调用和结构成员。
1. 算术操作符
+ - * / %
除了%操作符,其余几个操作符都是既适用于浮点类型又适用于整数类型;/操作符的两个操作数都为整数是,执行整除运算,而只要有浮点数执行的就是浮点除法;%操作符的两个操作数必须为整数,返回值为余数。
2. 移位操作符
<< 左移操作符
>> 右移操作符
在左移位中,值最左边的几位被丢弃,右边多出来的几位补0;
右移操作符分为两种,一种是逻辑移位,右边的几位被丢弃,左边多出来的位用0填充;另一种是算数移位,右边的几位被丢弃,左边多出来的几位由原先值的符号位决定,符号位为1则移入的位均为1,符号位为0则移入的位均为0,这样能够保证原数的正负形式不变。
注:对于无符号数执行的所有以为操作都是逻辑移位,对于有符号数,到底是采取逻辑移位还是算术移位取决于编辑器。
3. 位操作符
& 按位与
| 按位或
^ 按位异或
注:其操作数必须是整数。
4. 赋值操作符
赋值操作符把右操作数的值存储于左操作数指定的位置。赋值操作符的结合性(求值的顺序)是从右向左。
复合赋值符
+= -= *= /= %= <<= >>= &= ^= |=
复合赋值符可以使源代码更容易阅读和书写。
5. 单目操作符
! 逻辑反操作
- 负值
+ 正直
& 取地址
Sizeof 操作数的类型长度(以字节为单位)
~ 对一个数的二进制按位取反
-- 前置、后置--
++ 前置、后置++
* 间接访问操作符(解引用操作符)
(类型) 强制转换类型
&操作符产生它的操作数的地址;*解引用操作符是间接访问操作符,它与指针一起使用,用于访问指针所指向的值;sizeof操作符判断它的操作数的类型长度,以字节为单位表示,判断表达式的长度并不需要对表达式进行求值;(类型)操作符被称为强制类型转换,把强制类型转换放在一个表达式前面只会改变表达式的第一个项目的类型;前置++,操作数的值先自增,表达式的值就是操作数自增后的值(先计算,后赋值);后置++,操作数的值仍会自增,而表达式的值是操作数增加前的值(先赋值,后计算);前置--和后置--于++用法相同。
注:
1. sizeof(数组名):数组名单独放在sizeof内部时,数组名表示整个数组,求取的是整个数 组的大小,单位是字节;
2. &数组名:数组名也表示整个数组,故&数组名取出的是整个数组的地址;
3. 除此之外,所有遇到的数组名都表示首元素的地址。
6. 关系操作符
> >= < <= != ==
!=用于测试“不相等”,==用于测试“相等”。表达式的结果如果是0,它被认为是假;表达式的结果如果是任何非零值,它被认为是真。在使用==测试相等时,要注意不能写成=,=是用于赋值的。
7. 逻辑操作符
&& 逻辑与
|| 逻辑或
这两个操作符会控制子表达式的求值顺序。
&&操作符的左操作数总是首先进行求值,如果它的值为真,然后紧接着对右操作数进行求值。如果左操作数的值为假,那么右操作数便不再进行求值。
||操作符,首先对左操作数进行求值,如果它的值为真,右操作数便不再求值,因为整个表达式的值已经确定了,如果左操作数的值为假,就求取右操作数。
要区分与位操作符(&、|)的使用,位操作符两边的操作数都要进行求值。逻辑操作符用于测试零值与非零值,而位操作符用于比较它们的操作数中对应的位。
8. 条件操作符
exp1 ? exp2 : exp3
条件操作符接受三个操作数,也会控制子表达式的求值顺序。
首先计算的是exp1,如果它的值为真(非零值),那么整个表达式的值就是exp2的值,exp3不会进行求值。如果exp1的值为假(零值),那么整个表达式的值就是exp3的值,exp2不会进行求值。
9. 逗号表达式
exp1,exp2,exp3,…expN
逗号表达式就是用逗号隔开的多个表达式。自左向右逐个求值,整个表达式的值就是最后那个表达式的值。
10. 下标引用、函数调用和结构成员
(1)[] 下标引用操作符
接受两个操作数:一个数组名和一个索引值。
(2)() 函数调用操作符
接受一个或多个操作数,它的第一个操作数是函数名(函数名是地址), 剩余的操作数就是传给函数的参数。
(3)访问一个结构的成员(struct.成员名)
. 结构体.成员名
-> 结构体指针->成员名