操作符这块,你可得把握住(上)

这是我参与11月更文挑战的第17天,活动详情查看:2021最后一次更文挑战


最近,想复习一下C语言,所以笔者将会在掘金每天更新一篇关于C语言的文章! 各位初学C语言的大一新生,以及想要复习C语言/C++知识的不要错过哦! 夯实基础,慢下来就是快!


1.操作符分类

1
c复制代码算术操作符: + - * / %
1
c复制代码移位操作符: << >>
1
c复制代码位操作符: & | ^
1
c复制代码赋值操作符: =  +=  -=  *=  /=  %=  &=  ^=  & *
1
c复制代码单目操作符: sizeof ! ++ --
1
c复制代码关系操作符: > >= <= < != ==
1
c复制代码逻辑操作符: && ||
1
c复制代码条件操作符:  ?:		唯一的一个三木操作符
1
c复制代码逗号表达式: .
1
c复制代码下标引用,函数调用和结构成员: []  ()  .  ->

/ -除号操作符

对于除号操作符:

1.两边都是整数:执行整数除法,与保存的类型无关

1
2
3
4
5
6
7
8
9
10
11
c复制代码int main()
{
int a = 0;
int b = 0;
int c = 0;
printf("输入两个操作数:->\n"); // 5 2
scanf("%d %d", &a, &b);
c = a / b;
printf("结果为: %d\n", c); // 2
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
c复制代码//若接收类型为double类型
int main()
{
int a = 0;
int b = 0;
double c = 0;
printf("输入两个操作数:->\n"); // 5 2
scanf("%d %d", &a, &b);
c = a / b;
printf("结果为: %lf\n", c); // 2.000000 并不是2.500000
return 0;
}

% - 取模操作符

对于取模操作符:%操作符两边元素只能为整形

1
2
3
c复制代码int a = 10;
int b = 3;
int c = a % b;

1
2
3
c复制代码int a = 10;
double b = 3;
int c = a % b;//err

1
2
3
c复制代码int a = 10;
int b = 3;
double c = a % b; //接收类型可以为其他类型

A % B : 最终得到的值小于B

所以:

rand():产生随机数的函数-通常配套srand()函数:随机数生成器使用

(具体内容看分支与循环猜数字游戏)

​ –>srand(unsigned int)time(NULL) //拿时间戳作为参数

生成的随机数范围:0-32767

所以若要得到0-99的数:rand() %100

若要得到1-100的数:rand()%100 +1


<< >> 左移右移操作符

<< 左移操作符

右移操作符

移动的是二进制位(补码) –只针对整形


左移操作符 <<

左边丢弃,右边补0

左移相当于数值乘2

1
2
3
4
5
6
7
8
c复制代码int c = 4;
c << 1;
printf("%d\n",c); //4还是8?
//4 原因:并没有接收c << 1的值

//若想结果位8
c = c<< 1;
printf("%d\n",c); //8

右移操作符 >>

1
2
c复制代码情形1:逻辑右移:左边用0填充,右边丢弃
情形2:算术右移:左边补符号位,右边丢弃

当前VS2019采用的是算术右移

1
2
3
4
5
6
7
8
9
10
c复制代码int a = 1;
// 00000000 00000000 00000000 00000001 --原码
//正数:原反补相同

//若采取的是逻辑右移
// 00000000 00000000 00000000 00000000 -补码
//最高位为符号位:0,正数 原反补相同
//对应原码为:00000000 00000000 00000000 00000000 -打印结果为0
a = a >> 1;
printf("%d\n",a); //0

1
2
3
c复制代码//err写法
int a = 15;
int b = a >> -1; //C语言标准未被定义的写法

注意:左移/右移操作数只能为整形,不能为浮点数

1
2
c复制代码float c = 4,5f;
c >> 1; //err

补码为全1 -> %d打印 表示-1

补码求补码 ->原码


关于 & | ^

只能用在整形数据(正数,负数都可以)!

& 按位与

1
2
3
4
5
c复制代码 1001
&1111
-----
1001
//对应比特位进行按位与运算 有0则为0 两个比特位都为1,结果才为1

| 按位或

1
2
3
4
5
c复制代码 1001
|1111
-----
1111
//对应比特位进行按位与运算 有1则为1 两个比特位都为0,结果才为0

^ 按位异或

1
2
3
4
5
c复制代码 1001
^1111
-----
0110
//对应比特位进行按位异或运算 对应比特位相同为0 不同为1

使特定位翻转,即异或上该特定位为1,其它位为0的二进制序列

1
2
3
4
5
6
c复制代码如: X: 1100 0011 使倒数第三个二进制位翻转
使1100 0011异或上0000 0100
==> 1100 0011
^0000 0100
----------
1100 0111 ==>这样的话就使X的倒数第三位翻转了
1
2
3
4
5
6
7
c复制代码使特定位翻转:
对应X要翻转的比特位,该数的对应位为1,其他位为0,次数与X对应位异或即可
如:X = 10101110 使X的低4字节位翻转,
X ^ 0000 1111即可
==>1010 1110
^0000 1111
==>1010 0001 ->x的低4位翻转了

2.如何得到二进制序列最后一位比特位是1还是0

首先,整形在内存中以补码形式存储

方法:只需要让该位按位与上1,即可得知最后一位比特位是0还是1


若最后一位比特位为1:结果为1 否则为0

1的二进制序列: 00000000 00000000 00000000 00000001

符号位为0,正数:原反补相同

其他位比特为0,所以和比特位相于的结果为0

1
2
3
4
5
6
c复制代码int a  =15;
// 00000000 00000000 00000000 00001111 ->a的补码
//&00000000 00000000 00000000 00000001 ->1的补码
--------------------------------------
// 00000000 00000000 00000000 00000001 ->结果为1
//即a的最后一位比特位为1
1
2
3
4
5
6
7
8
c复制代码int main()
{
int a = 0;
int b = 0;
scanf("%d",&b);
a = b &1;
printf("%d补码的最后一位比特位是%d",b,a);
}

今天就先到这吧~感谢你能看到这里!希望对你有所帮助!欢迎老铁们点个关注订阅这个专题! 同时欢迎大佬们批评指正!


本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%