C语言中操作符和表达式
操作符分类:算数操作符,移位操作符,位操作符,赋值操作符,单目操作符,关系操作符,逻辑操作符,条件操作符,
逗号表达式,下标引用,函数调用和结构成员
~~~ 算数操作符 : + - * / %
1.除了%操作符之外,其他的几个操作符可以作用于整数和浮点数。
2.多于 / 操作符如果两个操作数都为整数,执行整数除法。而只要有浮点数执行的就是浮点数除法。
3.%操作符的两个操作数必须为整形,返回的是整出之后的余数。
~~~ 移位操作符: << 左移操作符 >>右移操作符
1.左移操作符移位规则:左边抛弃,右边补零
2.右移操作符移位规则:①逻辑移位:左边用零填充,右边丢弃
②算数移位:左边用原该值的符号为填充,右边丢弃
(注意:对于移位运算符,不要移动负位数,这个是标准未定义的。)
~~~ 位操作符 : &(按位与) |(按位或) ^(按位异或)
(注意:他们的操作数必须是整数。)
~~~ 赋值操作符 : = += -= *= /= %= >>= <<= &= |=
~~~ 单目操作符 :! (逻辑反操作) - (负值) + (正值) & (取地址) sizeof (操作数的类型长度,以字节为单位)
~ (对一个数的二进数按位取反) -- (前置,后置--) ++ (前置,后置++) * (间接访问操作符,解引用操作符)
(类型) 强制类型转换
~~~ 关系操作符 : > >= < <= != (用于测试“不相等”) == (用于测试“相等”)
~~~ 逻辑操作符 :&& 逻辑与 || 逻辑或
逻辑与和按位与的区别:1&&2-----------=1 1&2----------=0
逻辑或和按位或的区别:1 | | 2------------=1 1 | 2----------=3
~~~ 条件操作符 :exp1 ? exp2 : exp3 (eg:使用条件表达式实现找两个数中较大值)
~~~ 逗号表达式 :exp1,exp2,exp3,…expN
逗号表达式,就是用逗号隔开的多个表达式。
逗号表达式,从左向右依次执行。整个表达式的结果式最后一个表达式的结果。
~~~ 下标引用,函数调用,访问结构体的成员
1. [ ] 操作数:一个数组名+一个索引值
2. ( ) 函数调用操作符
接受一个或者多个操作数:第一个操作数是函数名,剩余的操作数就是传递给函数的参数。
3.访问一个结构的成员: . 结构体 . 成员名
->结构体指针->成员名
表达式求值:表达式求值的顺序一部分是由操作符1的优先级和结合性决定。同样,有些表达式的操作数在求值的过程中可能需要转换为其他类型。
隐式类型转换:C的整型算数运算总是至少以缺省整型的精度来进行的。为了获得这个精度,表达式的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为【整型提升】。
算数转换:如果某个操作符的各个操作符属于不同的类型,那么除非其中一个操作数的转换为另一个操作数的类型,否则操作就无法进行。下面的层次体系称为寻常算术转换。
long double double float unsigned int int
如果某个操作数的类型在上面这个列表中排名较低,那么首先转换为另一个操作数的类型后执行运算。
(注意:但是算术转换要合理,要不然会有一些潜在问题。)
操作符的属性
复杂表达式的求值有三个影响的因素:
1.操作符的优先级
2.操作符的结合性
3.操作符是否控制求值顺序
两个相邻的操作符先执行哪个?取决于他们的优先级。如果两者的优先级相同,取决于他们的结合性。
附:运算符优先级表
---------------------
原文:https://blog.csdn.net/ds19980228/article/details/79826412