Operator


算术操作符

  • + 加法,一元正号
  • - 减法,取负
  • * 乘法,解引用
  • / 除法
  • % 取余
  • ++ 自增
  • -- 自减
  • == 等于
  • != 不等于
  • < 小于
  • > 大于
  • <= 小于等于
  • >= 大于等于
  • && 逻辑与
  • || 逻辑或
  • ! 逻辑非
  • & 位与,取地址
  • | 位或
  • ^ 位异或
  • ~ 位取反
  • << 左移
  • >> 右移
  • = 赋值
  • += 加后赋值
  • -= 减后赋值
  • *= 乘后赋值
  • /= 除后赋值
  • %= 取余后赋值
  • &= 位与后赋值
  • |= 位或后赋值
  • ^= 位异或后赋值
  • <<= 左移位后赋值
  • >>= 右移位后赋值
  • ?: 条件操作符
  • , 逗号操作符
  • -> 结构体
  • . 结构体成员
  • (expr) 分组运算符,改变优先级
  • func() 函数调用运算符
  • (type)expr 类型转换运算符
  • [] 数组下标
  • sizeof 返回类型或对象的字节大小
  • _Alignof 返回类型对齐要求
  • _Generic C11特性,类型泛化
  • typecast 强制类型转换
优先级操作符结合性
1(), [], ->, .>
2++, --, +, -, !, ~, (type), *, &, sizeof<
3*, /, %>
4+, ->
5<<, >>>
6<, <=, >, >=>
7==, !=>
8&>
9^>
10|>
11&&>
12||>
13?:<
14=+=, -=, *=, /=, %=, &=, !=, ^=, <<=, >>=<
15,>

优先级(Precedence)与 结合性(Associativity)

优先级决定了哪些运算先执行。优先级高的运算先于优先级低的运算

结合性决定了相同优先级的运算符如何分组

两种结合性

1.左结合(从左到右):大多数运算符 2.右结合(从右到左):赋值、单目、三元条件运算符

示例

// 左结合
int a = 10 - 5 - 2;

// 右结合
int x, y, z;
x = y = z = 5;

()

求值顺序

语法树结构

序列点

a += ++a;
  • 赋值表达式本身有值
  • 前自增与后自增的返回时机不同