目录
自增自减运算符
条件运算符
逗号运算符
符号运算符
位操作运算符
位运算
正数
负数
运算规则
其他运算符
优先级
++: 在原来的基础上+1
--: 在原来的基础上-1
如
#include
int main()
{
int num = 0;
printf("num = %d\n", num);
num++; // ++运算符后置
// num += 1; num = num + 1;
printf("num = %d\n", num);
++num; // ++运算符前置
printf("num = %d\n", num);
return 0;
}
++后置,先用再算
++前置,先算再用
int num = 0;
int a = 0;
a = num++; // 后置
printf("num = %d\n", num); // 1
printf("a = %d\n", a); // 0
a = num = 0;
a = ++num;
printf("num = %d\n", num); // 1
printf("a = %d\n", a); // 1
注意:
++num++; ==> (++num)++;
num++ 是一个常量
++后置优先级比前置高,但是前置的运算效率比较高
?:
(表达式1) ? (表达式2) : (表达式3)
判断三个:
( (表达式1) ? (表达式2) : (表达式3) ) ?
( (表达式1) ? (表达式2) : (表达式3) ) :
(表达式3)
先执行表达式1,如果表达式1为真,执行表达式2,为假执行表达式3;
(表达式1) , (表达式2) , (表达式3)
从左到右,依次执行 取最后一个表达式的值作为整个逗号表达式的值
int a, b, c;
a = 1;
b = 2;
c = 3;
int num = (++a, a++, b + 10, c = b, a);
printf("a = %d\n", a);
printf("b = %d\n", b);
printf("c = %d\n", c);
printf("num = %d\n", num);
() []
括号括起来的先算 圆括号比方括号先算
多个括号 从左向右算
多层括号 从内向外算
按位与 &
按位或 |
按位非 ~
按位异或 ^
左移 <<
右移 >>
注意:
使用位操作运算符进行运算,都是以二进制补码进行运算,得到的结果也是二进制补码
原码 反码 补码(二进制)
我们知道: 整数可以写成二进制形式(原码)
原码: 整数写成二进制
反码: 和原码相同
补码: 和原码相同
int n = 165;
// 整数==>正数
// n:int==>字节(4*8=32)
// 原码: 0000 0000 0000 0000 0000 0000 1010 0101
// 反码: 0000 0000 0000 0000 0000 0000 1010 0101
// 补码: 0000 0000 0000 0000 0000 0000 1010 0101
原码: 整数写成二进制(符号位)
反码: 保持符号位不变 将原码按位取反
补码: 反码+1
int m = -5;
// 整数==>负数
// m:int==>字节(4*8=32)
// 原码: 1000 0000 0000 0000 0000 0000 0000 0101
// 反码: 1111 1111 1111 1111 1111 1111 1111 1010
// 补码: 1111 1111 1111 1111 1111 1111 1111 1011
从补码怎么求原码?
将补码当做原码,再求一次补码,得到的就是原码
按位与 & 同1为1
按位或 | 有1为1
按位非 ~ 取反(符号位参与运算)
按位异或 ^ 同则为0,异则为1
左移 << 向左移动,低位补0
右移 >> 向右移动,高位补符号位
int n = 10;
// & 双目运算符 同1为1
n = n & 1;
printf("n = %d\n", n);
// n: 0000 0000 0000 0000 0000 0000 0000 1010 (补码)
// 1: 0000 0000 0000 0000 0000 0000 0000 0001 (补码)
// &: 0000 0000 0000 0000 0000 0000 0000 0000 (补码) ==> 0
n = 10;
n = n & -1;
printf("n = %d\n", n);
// n: 0000 0000 0000 0000 0000 0000 0000 1010 (补码)
// -1: 1000 0000 0000 0000 0000 0000 0000 0001 (原码)
// -1: 1111 1111 1111 1111 1111 1111 1111 1110 (反码)
// -1: 1111 1111 1111 1111 1111 1111 1111 1111 (补码)
// &: 0000 0000 0000 0000 0000 0000 0000 1010 (补码:结果)
n & 1;
n | 1;
~n;
n ^ 1;
int n = 10;
n = n << 1;
printf("n = %d\n", n);
// n: 0000 0000 0000 0000 0000 0000 0000 1010 (补码)
// <<1: 0000 0000 0000 0000 0000 0000 0001 0100 (补码) 20
n = 10;
n = n >> 1;
printf("n = %d\n", n);
使用位运算符,写一个表达式,做以下判断(int类型)
1 判断一个数是否是2的n次方
!(n&(n-1))
2 判断一个数是否是偶数
!(n&1)
3 是否是正数
!(n>>31)
不使用第三方变量,使用位运算符,写一个表达式,交换两个变量的值
int a = 10, b = 20;
// 1
int c;
c = a;
a = b;
b = c;
printf("a = %d, b = %d\n", a, b);
// 2
a = a + b;
b = a - b;
a = a - b;
printf("a = %d, b = %d\n", a, b);
// 3
a = a^b;
b = a^b;
a = a^b;
printf("a = %d, b = %d\n", a, b);
箭头 ->
点 .
负号 -
取内容 *
取首地址&
求字节数sizeof()
作用域符 ::
优先级 | 操作符 | |||
---|---|---|---|---|
1 | () | [] | -> | . |
:: | ||||
! | ~ | ++ | -- | |
2 | - (unary) | * (dereference) | ||
& (address of) | sizeof | |||
3 | ->* | .* | ||
4 | * (multiply) | / | % | |
5 | + | - | ||
6 | << | >> | ||
7 | < | <= | > | >= |
8 | == | != | ||
9 | & (bitwise AND) | |||
10 | ^ | |||
11 | | | |||
12 | && | |||
13 | || | |||
14 | ? : | |||
15 | = | += | -= | etc. |
16 | , |