AImager

共44个运算符,以下按优先级排序,从上往下优先级降低,同级相等,第一个括号里的表示结合性,第二个括号里的表示个数。

  • 初等运算符(左到右)(4):( ) [ ] . ->(连接指针变量与结构体成员)
  • 单目运算符(右到左)(9):! ~(位反) ++ -- - * & sizeof ( )(用于强制类型转换)
  • 算数运算符(左到右)(3):* / %
  • 算数运算符(左到右)(2):+ -
  • 位运算符(左到右)(2):<<(位左移) >>(位右移)
  • 关系运算符(左到右)(4):> >= < <=
  • 关系运算符(左到右)(2):== !=
  • 位运算符(左到右)(1):&(位与)
  • 位运算符(左到右)(1):^(位异或)
  • 位运算符(左到右)(1):|(位或)
  • 逻辑运算符(左到右)(1):&&
  • 逻辑运算符(左到右)(1):||
  • 条件运算符(右到左)(1):?:(条件求值)
  • 赋值运算符(右到左)(11):= += -= *= %= >>= <<= &= ^= |= /=
  • 逗号运算符(左到右)(1):,(顺序求值)

结合性

C标准中没有给出结合性的标准说明,不过一个比较正确的理解是『在一个表达式中,如果多个符号的优先级相同,那就按结合性选择运算顺序』,如a=b=c,=是从右下向左的结合性,所以先算后面的=再算前面的。

求值顺序

和求值顺序有关的只有以下四个运算符

  • && 先算左边,左边为True时算右边,为False则忽略右边
  • || 先算左边,左边为False时算右边,为Ture则忽略右边
  • , 先算左边,算完后扔掉值再算右边
  • ?: 先算最前面,结果为True就算中间,False就算后面

++

++前缀先算,后缀如果在混合运算中,先忽略掉,即直接算混合运算,混合运算算完后再进行单独的后缀运算,++必须紧跟值而不能跟表达式。