c提供了所有你希望编程语言应该拥有的操作符,它甚至提供了一些你意想不到的操作符。事实上,c被许多人所诟病的一个缺点就是其种类繁多的操作符。c的这个特点使得它很难精通。另一方面,c的许多操作符具有其他语言的操作符无法抗衡的价值,这也是c适用于开发范围极广的应用程序的原因之一。
为了方便解释,我们将操作符可以简单的分为算数操作符、移位操作位、位操作符、赋值操作符、单目操作符、关系操作符、逻辑操作符、条件操作符、逗号表达式、下标引用函数调用和结构成员等类。下面我们简单的介绍下这些操作符及简单应用。
常用算数操作符:+ - * / %
除了%操作符都是既适用于浮点类型又适用于整形类型。/操作符俩个操作数有一个为浮点型就执行浮点型除法运算。%为取模操作符,值得注意的是,取模运算只能进行整型运算。
移位操作符:<<(左移) >>(右移)
移位操作只是简单的把一个值的位向左或向右移动。在左移位中,值最左边的几位被丢弃,右边多出来的几个空位补0。而右移位操作中存在左移位操作不曾面临的问题:从左边移入新位是,可以有两种方案。
一种为逻辑移位,左边的空位全补0,另一种为算术移位,左边移入的位由其原来的符号位决定,符号位为1则全为1,符号位为0则全为0.
位操作符:& | ^
假定变量a的二进制为00101110,变量b的二进制为01011011。
a&b = 00001010 , a | b = 01111111 , a ^ b = 01110101
赋值操作符:=
赋值操作符的结合性:从右向左
单目操作符:! ++ -- ~ sizeof * (类型)
!为逻辑反操作符,如果操作数为真,其结果就为假。反之,如果操作符为假,其结果就为真。
++ -- 为自增自减操作符
*为间接访问操作符,它与指针一起使用,用来访问指针所指向的值。
~ 为按位取反操作符,假定a的二进制为0001 ~a为1110
sizeof操作符用来判断操作数类型长度,以字节为单位。
()为强制类型转换操作符,它用于将表达式的值转换为另外的类型。
关系操作符:> >= < <= != ==
前面四个操作符就如我们数学中一样,一看便知。!=操作符为不等于,==为等于。
逻辑操作符:&& || !
&&逻辑与操作符为表达式1和表达式2都为真的情况下,那么整个表达式也为真。否则,就是假的。
||逻辑或操作符为表达式1和表达式2都为假的情况下,那么整个表达式也为假。否则,就是真的。
条件操作符:表达式1?表达式2:表达式3
条件操作符接受3个操作数,它会控制子表达式的求值顺序。即表达式1为真,则执行表达式2.反之,执行表达式3.条件操作符的优先级非常低,所以它的各个操作数即使不加括号,一般也不会出问题,但是为了清楚起见,我们还是倾向于在子表达式中加上括号。这是一种较好的代码风格。
逗号表达式: ,
逗号操作符将多个表达式分隔开来。这些表达式自左向右依次求值,整个逗号表达式的值就是最后那个表达式的值。
下标引用函数调用和结构成员:[ ] . ->
arr[10]相当于*(arr+(10)) . 和 ->用来访问一个结构体的成员 如果s为结构变量,s.a就是其成员。当你拥有一个指向结构的指针而不是结构本身,这时需要访问结构变量,就需要->操作符。
如有不足之处请见谅,并批评指正。