算术操作符:+ - * / %
1.除啦%操作符之外,其他的几个操作符可以作用与整数和浮点数。
2.对于 / 操作符如果两个操作数都为整数,执行整数除法。而只要有一个操作数为浮点数就执行浮点数除法。
3.%操作符的两个操作数必须徐都为整数。返回的是整除之后的余数。
移位操作符:左移<< 右移>>
左移操作符:移位规则:左边抛弃,右边补0。
右移操作符:移位规则:首先右移运算分两种:
1.逻辑移位 左边用0填充,右边丢弃 。
2.算术移位 左边用原该值的符号位填充,右边丢弃。
警告 : 对于移位运算符,不要移动负数位,这个是标准未定义的。
位操作符:按位与 & 按位或 | 按位异或 ^
注:它们是在二进制下实现的,它们的操作数必须是整数。
按位与:只要遇见0结果就为0,剩下的一种情况1 & 1为1。
按位或:只要遇见1结果就为1,剩下的一种情况0 | 0为0。
按位异或:相同为0,相异为1。
赋值操作符:=
赋值操作符是一个很棒的操作符,他可以让你得到一个你之前不满意的值。也就是你可以给自己重新赋值。
复合赋值符:+= -= *= /= %= >>= <<= &= |= ^=
这些运算符都可以写成复合的效果。 比如:x=x+10和x+=10是一样的效果。
单目操作符: 逻辑反操作 !负值 - 正值 + 取地址 & 操作数的类型长度(以字节为单位) sizeof 对一个数的二进制按位取反~
前置、后置 -- 前置、后置++ 间接访问操作符(解引用操作符) * 强制类型转换(类型)
关系操作符:> >= < <= != ==
警告: 在编程的过程中== 和=不小心写错,导致的错误, 所以我们一般用这种方法例如:( 10 == a )这样就可以解决。
逻辑操作符:逻辑与&& 逻辑或 ||
这里有个需要注意的,如先定义a=0,b=1,c=2,i =(a++&&++b&&c++)执行完之后i=0,a=1,b=1,c=2。意思就是说在进行逻辑与的时候当a=0时,也就是为假时就不会在执行后面的++b&c++,或者当b=0时就不会执行c++。
同样的,逻辑或当前面为真的时候就不会再执行后面。
条件操作符:exp1?exp2:exp3
意思是如果第一个表达式为真,就执行表达式2,第一个为假,就执行表达式3。
逗号表达式:exp1,exp2,exp3.······expN
逗号表达式,就是用逗号隔开的多个表达式。 逗号表达式,从左向右依次执行。整个表达式的结果是最后一个表达 式的结果。
下标引用、函数调用和结构成员
1.[ ]下标引用操作符。操作数:一个数组名+一个索引值
2.()函数调用操作符 接受一个或者多个操作数:第一个操作数是函数名,剩余的操作数就是传递给函数的参数。
3.访问一个结构的成员:. (结构体.成员),-> (结构体指针->成员名) .
表达式求值
表达式求值的顺序一部分是由操作符的优先级和结合性决定。
同样,有些表达式的操作数在求值的过程中可能需要转换为其他类型。
隐式类型转换
C的整型算术运算总是至少以缺省整型类型的精度来进行的。 为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升
算术转换
如果某个操作符的各个操作数属于不同的类型,那么除非其中一个操作数的转换为另一个操作数的类型,否则操作就 无法进行。
操作符的属性
复杂表达式的求值有三个影响的因素.
1.操作符的优先级
2.操作符的结合性
3.是否控制求值顺序。
两个相邻的操作符先执行哪个?取决于他们的优先级。如果两者的优先级相同,取决于他们的结合性。
