本帖最后由 鸦领主 于 2020-11-29 13:20 编辑
目录:
一、运算符
1.基本运算符
2.比较运算符
3.逻辑运算符
4.位运算
5.位运算的实际运用
6.运算符的优先级
一、运算符
1.基本运算符
a)常量和变量的空间测量sizeof
不是运算时计算,而是编译时计算的
b)条件运算符号:
?:凡是if都可以转化为这个条件运算符表示(减少代码行数)
列:
[pre] int i; int i;
if (3 > 2) 等价于 i = 3 > 2 ? 4 : 3; /成立执行左边,不成立执行右边
i = 4;
else
i = 3;
if( i != 0 )可以简写为if(i)
if(i==0)可以简写为if(!i)
[/pre]
C语言学习第七天 运算符
=
C语言学习第七天 运算符
c)自增自减:
++自增,--自减
i++等于i=i+1
i--等于i=i-1
d)自运算符号:+= ,-=,*=,/=,%=
i+=5等于i=i+5
i-=5等于i=i-5
i*=5等于i=i*5
i/=5等于i=i/5
i%=5等于i=i%5
2.比较运算符
a)基本条件运算符:”==“ !=“ < ”> “<= ”>=“
它们的补集关系:==和!= <和>= <和>=
列如:
i==10的补集i != 10
i>10的补集i<=10
i<的补集是i>=10
3.逻辑运算符
(复合多个条件判断的符号,结果真[1]和假[0])
a) &&逻辑与:俩个条件都成立时,整体才成立
列如:if(a > 100 && a <= 200)只有a大于100与a小于等于200才会执行if里面的东西
b) ||逻辑或:俩个条件有一个成立时,整体就成立
列如:if(a < 0 || a>100 ) 当a小于0时条件成立或a大于100时条件也成立
c) !逻辑非:对一个集合取补集
列如:if(a==0)→if !(a==0)等价于if(a!=0)
if !(a>0 && a<=100)等价于→if(a<=0 || a>100)
4.位运算符号
a)<<左移运算符:i<<n(把i往左边移n位)结果是i*2的n次方
3<<4 把二进制0000011(3)整体向左边移动4位0110000(48)
b)>>右移运算符:i>>n(把i往右边移n位)结果是i/2的n次方
50>>5 把二进制110010(50)整体向右边移动5位000001(1)
注意(右移)
对于有符号变量:
高位是1时,高位移动剩余位置填充1
高位是0时,高位移动剩余位置填充0
对于无符号变量:
统一填充为0
4.位运算
& (按位与):有0出0,无0出1(把俩个十进制数的二进制相与)
列如:
15&13=13 52&32=16
1 1 1 1 1 1 0 1 0 0
1 1 0 1 =1101 0 1 0 0 0 1=010000
=======================================
| (按位或):有1出1,无1出0(把俩个十进制数的二进制相或)
列如:
15&13=15 52&32=53
1 1 1 1 1 1 0 1 0 0
1 1 0 1 =1111 0 1 0 0 0 1=110101
======================================= ~ (按位取反):将一个数字的所有二进制0变成1,把1变成0
有符号时:-1变0,0变-1,1变-2......55变-56
无符号时:-1变0,0变4G-1,1变4G-2.......57变4G-58
列如;
00......0001→11.....1110
=======================================
^ (按位异或):相异为1,相同为0(把俩个十进制数的二进制异或)
列如:
15&13=2 52&32=37
1 1 1 1 1 1 0 1 0 0
1 1 0 1 =0010 0 1 0 0 0 1=100101
=======================================
5.位运算的实际运用
#define 定义一个标识符来表示一个常量。
用 #define 定义标识符的一般形式为:
#define 标识符 常量 //注意, 最后没有分号
”|“(或)将一些标识符组合在一起,已经有的标识符不会加在一起
#include<stdio.h>
#define zhong 4
#define hua 5
#define ren 8
#define min 15
int main()
{
int i = hua | zhong; //5|4=5 hua和zhong组合在了一次
i = i | ren; //5|8=13 然后在和ren组合
i = i | ren; //13|8=13 又和ren组合,重复了并没有改变
return 0;
}
hua 和zhong先组合0101 | 0100
得出i=5=0101在和ren组合0101 | 1000
得出i=131101再一次和ren组合1101 | 1000
得出i=13=1101,已经有的标识符不会加在一起
“&”判断一些组合后的混合标识符,是否有指定的标识符,或者用来清理大部分位为0
if (i & ren) (i & min) ? printf("存在") : printf("不存在");//执行不存在
printf("存在");//执行存在
else
printf("不存在");
1101 i=13 1101 i=13 1101 i=13
0100 zhong=4 0101 hua=5 1111 min=15
得出0100 代表存在 得出0101 代表存在 没有得出1111 代表不存在
“&~”用来删除混合标识符中的某一个标识符
i = i & ~ren; //i=5,删除了ren这个标识符
i = i & ~ren;//i=5 ,删除过后再次删除将不会做任何改变
00......1101 此时i是5 00......0101
11......0111得出 再次删除ren ~ren是 11......0111得出
00.......0101 i=5 00......0101 i还是5
6.运算符的优先级:
(所有判断符号如果先算,结果必然是1,或0)
一级(左):()圆括号 []下标运算符 ->指向结构体成员运算符 . 结构体成员运算符
二级(右):!逻辑非运算符 ~按位取反运算符 ++自增运算符 --自减运算符 -符号运算符 (类型)类型转换运算符 *指针运算符 &地址与运算符 sizeof长度运算符
三级(左):*乘法运算符 /除法运算符 %取余运算符
四级(左):+加法运算符 -减法运算符
五级(左):<<左移运算符 >>右移运算符
六级(左): < ,<=, >, >=, 关系运算符
七级(左):==等于运算符 !=不等于运算符
八级(左):&按位与运算符
九级(左):^按位异或运算符
十级(左):|按位或运算符
十一级(左):&&逻辑与运算符
十二级(左):||逻辑或运算符
十三级(右):?:条件运算符
十四级(右):+= ,-=, *= ,/= ,%=, =, >= ,<, <= ,&=, ^=, |= 赋值运算符
十五级(左):,逗号运算符(从左到右依次运算,最终结果采取最右边的结果)
补充:c语言容易出漏洞的地方是:
a) switch中忘记break;
b判断语句甲把赋值符号(=)当作判断符号(==)
|