• 算术运算符
  • 关系运算符
  • 逻辑运算符
  • 位运算符
  • 赋值运算符
  • 杂项运算符

    算术运算符

    加减乘除+ - * / %(取模) 以及++和--

  • ?++/—:先赋值再执行++/—运算

  • ++/—?:先执行++/—运算再进行赋值

++,—中printf顺序和赋值一样 如i=5;while(i++){printf(i)}结果为4

  • 取模运算:小模大:还是小 如果涉及正负,结果正负只跟%前数有关 如**-3%1=-1 3%-1=-1 -3%-1=-1**

关系运算符

  • == != > < >= <=

    逻辑运算符

    | 运算符 | 描述 | 实例 | | —- | —- | —- | | && | 称为逻辑与运算符。如果两个操作数都非零,则条件为真。 | (A && B) 为假。 | | || | 称为逻辑或运算符。如果两个操作数中有任意一个非零,则条件为真。 | (A || B) 为真。 | | ! | | |

java中是为true/false进行运算。(java中只有布尔值能使用逻辑运算符)
c语言无布尔类型,便以0,1替代;为真输出1,假则0
c语言中为0和null的为假。非0非空为真

c中则可以2个数值型使用逻辑运算符,如float&&int
字符型也可以进行逻辑运算和位运算,自动转为ASCII

位运算符

将数值型或者字符型转为二进制,然后按位进行位运算
&(按位与) |(按位或) ^(异或) ~(取反) <<左移(增加位数)(右边补0)
>>右移(减少位数)(正数左补0,负数左补1)

p q p & q p | q p ^ q
0 0 0 0 0
0 1 0 1 1
1 1 1 1 0
1 0 0 1 1

赋值运算符

除了=以外,还有这种形式:**A?=B 相当于A=A?B **
?可以是+ - * / % << >> & | ^

杂项运算符

  • sizeof() 返回变量的大小 也可以返回数据类型大小 是的,这不是函数而是运算符
  • &:返回变量的地址 即**取地址符**
  • *:指向一个变量,即**取指针值 **
  • ?: 条件表达式 即三目运算符 根据条件选择执行哪句语句,并返回结果

    运算符优先级

    表格由上至下优先级不断降低
类别 运算符 结合性
后缀 () [] -> . ++ - - 从左到右
一元 + - ! ~ ++ - - (type)* & sizeof 从右到左
乘除 * / % 从左到右
加减 + - 从左到右
移位 << >> 从左到右
关系 < <= > >= 从左到右
相等 == != 从左到右
位与 AND & 从左到右
位异或 XOR ^ 从左到右
位或 OR | 从左到右
逻辑与 AND && 从左到右
逻辑或 OR || 从左到右
条件 ?: 从右到左
赋值 = += -= *= /= %=>>= <<= &= ^= |= 从右到左
逗号 , 从左到右

结合性

  • int x=1,y=0;则表达式x-->(y+x)?5:25>y++?'1':'2' 的结果?.

根据结合性所以后面的三目为25>y++?'1':'2' 得到1,y变为1 再x-->(y+x)?5:11>(1+0)?5:1 得到5,然后x变为0
所以结果最后为5

优先级

int a=3,b=2; printf("%d", (a+++b)); 输出5 因为后缀++比+和前缀++的优先级高 所以会优先认为这是一个后缀++ 所以会执行a++ + b 而不是a+ ++b