++,—中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:1 即1>(1+0)?5:1 得到5,然后x变为0
所以结果最后为5
优先级
int a=3,b=2;
printf("%d", (a+++b)); 输出5 因为后缀++比+和前缀++的优先级高 所以会优先认为这是一个后缀++ 所以会执行a++ + b 而不是a+ ++b
