操作符与表达式

算术操作符

+ - * / %
  • 除了 % 操作符之外, 其他几个操作符可以用于整数和浮点数
  • 对于 / 操作符, 如果两个操作数都为整数, 执行整数除法. 而只要有浮点数, 还行的就是浮点数除法
  • % 操作符的两个操作数必须为整数. 返回的是整数之后的余数

移位操作符

<< 左移操作符
>> 右移操作符
  • 左移操作符移位规则: 左边抛弃, 右边补0
  • 右移操作符移位规则
    • 逻辑移位: 左边用0填充, 右边丢弃
    • 算术移位: 左边用原值的符号位填充, 右边丢弃

对于移位运算符, 不可以移动负数位, 这是标准未定义的

位操作符

& 按位与
| 按位或
^ 按位异或

赋值操作符

=

复合赋值符

+= -= *= /= %= >>= <<= &= |= ^=

单目操作符

! 逻辑反操作
- 负值
+ 正值
& 取地址
sizeof 操作数的类型长度(以字节为单位)
~ 对一个数的二进制按位取反
--
++
* 解引用操作符

--与++前置与后置的区别:

前置: 先自增/自减, 后赋值

后置: 先赋值, 后自增/自减

关系操作符

> >= < <= != ==

逻辑操作符

&& 逻辑与
|| 逻辑或

区分逻辑与和按位与 逻辑或和按位或

1 & 2 ---> 0
1 && 2 ---> 1

1 | 2 ---> 3
1 || 2 ---> 1

条件操作符

exp1 ? exp2 : exp3

逗号表达式

exp1, exp2, exp3......expN

从左到右依次执行, 整个表达式的结果是最后一个表达式的结果

下标引用

[] 操作数: 一个数组名 + 一个索引值

函数调用

() 第一个操作数是函数名, 剩余的操作数是传递给函数的参数

结构成员

. 结构体.成员名
-> 结构体指针->成员名

表达式求值

隐式类型转换

  • C的整型算数运算总是以缺省整型类型的精度来进行的
  • 表达式中的字符和短整型操作数在使用之前被转换为普通整型, 这种转换被称为整形提升

算术转换

  • 如果某个操作符的各个操作数属于不同类型, 那么首先要转换为另一个操作数的类型后执行运算

操作符的属性

复杂表达式的求值有三个影响的因素

  1. 操作符的优先级
  2. 操作符的结合性
  3. 是否控制求值顺序

操作符优先级

 


我们的征途是星辰大海!