运算符知识点

(1)算术运算符

符号:+ - * / %
(1)越界(数据溢出)
(2)同类型数据计算结果类型不变
整数类型除法 相当于 整除(截取整数部分的结果)
(3)0不能作为除数 浮点类型除外 0.0
(4)% 取余 操作数不能是浮点数 编译通不过

类型混合运算:自动扩充
char->short->int->long->float->double
signed + unsigned ==> unsigned

char->int 8bit扩充成32bit 24补char的最高位

(2)赋值运算符

=
向右结合
int a;
float f;
f = a = 3.14;
混合赋值
+= -= *= /= %=
a += 20; ==> a = a+20; a/=3; a = a/3;
a =+ 20;

(3)自增减运算符

++ –
int z = x++; // z=x; x=x+1;
int z = ++x; // x=x+1; z=x;
前加加(减减) 先自增(减),然后再运算
后加加(减减) 先运算,然后再自增(减)
int y = x++ + ++x;
x = x++ + ++x;
(i)不要在同一个表达式中对同一个变量进行多次自增减运算
(ii)浮点类型数据可以进行+±-,但很少用

(4)关系运算符

= < <= == !=
= 大于或者等于
=>
数学逻辑
重要: 关系表达式的结果是 1 或者 0
一个关系,两种情况 成立(真 1) 不成立(假 0)
注意:
(1) 关系表达式结合是从左往右 1<x<2 恒成立
(1<x)<2 (1<x) 的结果是0或者1 1<2 0<2 恒成立
在语言中 x<y<z 表达式编译不会报错
并且C语言不会编译成 y 在(x,z)中间
(x<y)<z 0<z 或者 1<z
(2) 一个=和两个=
判断是否相等 一定要有 两个 =
int x = 0;
if(x=0){
//永远不会执行
}
if(x0){}
if(x=v){
v非0时执行
}else{
v为0时执行
}
(3) i<j
k<l > (i<j) == (k<l)
比较运算符优先级高于 判等 运算符
如果要行判断相等得加() i<(j
k)<l

(5)逻辑运算符

&& || !
逻辑表达式的结果是 1 或者 0
在C语言中表示真 和 假
假值: 0 (-0.0000001,0.0000001) NULL
真值: 非"零"
逻辑: 真 或者 假
&& 逻辑与 两者都成立才为真 而且
真&&真 真
真&&假 假
假&&真 假
假&&假 假

|| 逻辑或 或者 只要满足其中之一即为真
真||真 真
真||假 真
假||真 真
假||假 假

! 逻辑非
!真 假
!假 真

判断 x是否在 (1,10)区间
1<x<10是错误
1<x && x<10 ==> 如果 x>1 而且 x<10 成立

注意:
(i) x>1 && x<10
关系运算符优先级高于逻辑运算符
逻辑运算符经常用于 连接 多个 关系表达式
(ii) 短路特性
假&&表达式 恒为假 后面表达式的结果无论是真或者假都无法改变整个逻辑表达式的结果,后面表达式将不再进行运算 这种现象称为短路特性

真||表达式 恒为真
表达式不能影响结果,所以不再进行运算
(iii) && 结合性优先级 高于 ||
int a=1,b=1,c=1;
int x = ++a>1||++b>1&&++c>1;
++a>1||(++b>1&&++c>1);

(6)位运算符

按位进行运算
& | ^ ~ >> <<
& 按位与
二进制0或者1
1&1 = 1
1&0 = 0
0&1 = 0
0&0 = 0
14&8 = 8
0000 1110
0000 1000
---------------
0000 1000

-9&13 = 5
1111 0111
0000 1101
---------------
0000 0101

int num = 2019;
int x = num & -1;
0101001001010 num
1111111111111
-----------------
0101001001010 num

| 按位或
二进制位0或者1
1|1 = 1
1|0 = 1
0|1 = 1
0|0 = 0
14|8 = 14
0000 1110
0000 1000
-------------
0000 1110
-15|12
1111 0001 -15
0000 1100
----------
1111 1101 = -3

10010101010 num
00000000000
-------------
10010101010 num

^ 按位异或 异1 二进制位不同则为1
二进制位0或者1
1^1 = 0
1^0 = 1
0^1 = 1
0^0 = 0

14^8 = 6
0000 1110
0000 1000
----------
0000 0110
-15^12 =
1111 0001
0000 1100
----------
1111 1101 = -3

-7^9 =
1111 1001
0000 1001
----------
1111 0000 = -16

101000101 num
000000000 ^
-----------
101000101 num

推论(整数):
-1 & num == num
0 & num == 0
-1 | num == -1
0 | num == num
0 ^ num == num
-1 ^ num == ~num == -(num+1)
负数补码:
~num+1 = -num;
~num = -num-1;
~num = -(num+1);

~ 按位取反
二进制位0或者1
~0 = 1
~1 = 0

整数:
~0 = -1
~-1 = 0
~num = -(num+1);
负数求补码:
~num+1 = -num; ==> ~num = -(num+1);
char c = 234;
int x = ~c;// 21
unsigned char a = 234
int y = ~c;// -235

右移
右边移出的位舍弃 如果是有符号(signed)的数 补符号位
如果是无符号(unsigned)的数 补0
除了负的奇数 每向右移一位 相当于除以2

<< 左移
左边移出的位舍弃 右边补0
每向左移一位 相当于乘以2

注意:
(i) 算术优先级高于 移位运算符
234>>1+3 ==> 234>>(1+3) ==> 234>>4

嵌入式里最经典的问题:
把num从低到高 第3个二进制位 置1 其它的位不变
num = 0x4 | num;
num = 1<<2 | num;
把num第5个二进制位 置0 其它的位不变
num = ~(1<<4) & num;

假设x和y都是正整数
求 (x&y)+((x^y)>>1)
两个人: 苹果和香蕉
x&y 求相同的二进制位
x^y 求二进制不同的位 >> 1 除以2

(7)条件运算符 三目运算符

?:
expr?expr1:expr2
expr1和expr2两个式子 只会执行其中之一
如果expr的结果为真 则取expr1的结果,否则取expr2的结果

(8)sizeof

(i)运算符 不是函数
(ii) sizeof(操作数)
操作数可以是变量、数值、类型、表达式
(iii) 计算存储数据或者类型或者表达式的结果需要的字节数
(iv) 只关心类型 不计算表达式
(v) 对于类型 不能省略()
sizeof(long) 4/8
int i = 0;
sizeof(++i) i的值不变 ++i不会运行
sizeof(混合类型表达式) 宽度最大的字节类型的大小
浮点数字面值默认是double类型,如果要表示float的浮点字面值需要加f/F
sizeof(3.14+5/2);//8
sizeof(3.14f+5/2);//4
char a = 1,b = 2;
sizeof(a+b);//4 char在算术运算时扩充成int类型

(9)其它

& 取址运算符 取得变量的地址
, 分隔作用 表示一条语句
() 优先级
[] 数组元素访问运算符
. 成员访问运算符
* 取值运算符
-> 结构体指针访问成员运算符

(10)优先级:

算术 > 关系(比较高于判等) > 逻辑(&&高于||, !高于&&和||)
算术 > 位移
() 来限定优先级

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值