操作符详解(2)

发布于:2024-06-16 ⋅ 阅读:(143) ⋅ 点赞:(0)

上次我们讲了算术操作符

加减乘除取模

除号

如果你想得到整数,那么两边必须是整数,如果你想得到浮点数,那么你的操作数的两端必须有一个是浮点数

而取模% 两边必须是整数,返回的是整除后的余数

然后我们还讲了左移和右移操作符

箭头左那就是左移

箭头右那就是右移

左移操作符规则很简单

左边抛弃,右边补0

右移操作符规则

右移操作符有两种运算

算术移位和逻辑移位

逻辑移位

左边补0,右边丢弃

算术移位

左边补原符号位,右边丢弃

接下来我们讲位操作符(只能用于整数)

位操作符有

按位与&

按位或 |

按位异或 ^

我们先来讲按位与的计算规则

假设-5和3相与

按位与,与的是他们的补码, 与的规则是两个都为真,才输出真(1),否则输出假(0)

-3的补码

0000 0000 0000 0000 0000 0000 0000 0011

-5的补码的计算过程

100000000000000000000000000000000101(原码)

111111111111111111111111111111111010 (反码)

111111111111111111111111111111111011 (补码)

-3的补码

0000 0000 0000 0000 0000 0000 0000 0011

-5的补码

111111111111111111111111111111111011 (补码)

000000000000000000000000000000000011(两个相与算出的补码)

我们用%d打印。%d打印的是原码,所以我们要把补码换算成原码

因为他的最高位是0所以正数,正数的原反补都相同 所以

000000000000000000000000000000000011(这个就是他的原码)

打印出来就是3

#include<stdio.h>
int main()
{
	int c=-5&3;
	printf("%d\n",c);
	return 0;
}

接下来讲或

两个数之中有1就为真,两个都为假才为假

二进制位中有1就为1,两个为0才为0

再用-5和3举例

-3的补码

0000 0000 0000 0000 0000 0000 0000 0011

-5的补码

111111111111111111111111111111111011 (补码)

两个向或

111111111111111111111111111111111011 (补码)

因为最高位是1,所以是负数,补码要进行换算才能得到原码

111111111111111111111111111111111010 (反码)

100000000000000000000000000000000101 (原码)

得到的值是-5

#include<stdio.h>
int main()
{
	int c=-5|3;
	printf("%d\n",c);
	return 0;
}

异或

异或的规则 相同为0 相异为1

再用-5和3举例

-3的补码

0000 0000 0000 0000 0000 0000 0000 0011

-5的补码

111111111111111111111111111111111011 (补码)

两个异或

111111111111111111111111111111111000(补码)

111111111111111111111111111111110111 (反码)

100000000000000000000000000000001000 (原码)

得到的是-8

#include<stdio.h>
int main()
{
	int c=-5^3;
	printf("%d\n",c);
	return 0;
}

一道变态的笔试题

不能创建第3个变量,实现两个数的交换

要想解决这个问题,我们先要看两个东西

3^3=0;

011

011

相异或等于0

0^5 =5

000

101

101

然后再看一个东西

3^3^5=5

3^5^3=5;

011

101

110

011

101

还是得到5

说明了相异或具有交换律

#include<stdio.h>
int main()
{
	int a = 3;
	int b = 5;
	printf("交换前%d %d\n", a, b);
	a = a ^ b; //a = 3 ^ 5;
	b = a ^ b; //b = 3 ^ 5 ^ 5;
	a = a ^ b;//a=3^5^3
	printf("交换后%d %d\n",a,b);
	return 0;
}

接下来我们赋值操作符

创建一个变量同时给他一个值,这就叫做初始化

赋值就是你初始化的值,你不满足,你又给他来了一个值就叫赋值

我们的赋值操作符还可以连续使用、

但是不建议这样写,因为你调试一下就过去了,你无法看到他们单步的样子,而且可读性不好

#include<stdio.h>
int main()
{
	int a = 16;
	int b = 20;
	a = b = a + b;
	printf("%d", a);//从右向左算,a+b先赋值给b,再赋值给a就是36了
	return 0;
}

我们还有复合操作符

单目操作符

单目操作符:只有1个操作数

a+b,双目操作符,操作符 有两个操作数,

!逻辑反操作

我们C语言是怎么判断真假的 0为假 非0为真

#include<stdio.h>
int main()
{
	int a = +16;//正号表示他是正数
	int b = +20;
	return 0;
}

正号放了什么都不干

#include<stdio.h>
int main()
{
	int a= -10;
	int b = +a;
	printf("%d\n", a);
	printf("%d\n", b);
	return 0;
}
#include<stdio.h>
int main()
{
	int a= -10;
	int b = -a;
	printf("%d\n", a);
	printf("%d\n", b);
	return 0;
}

sizeo是一个操作符也叫运算符

计算的是类型和变量所占内存中间的大小

计算类型所创建的变量占据空间的大小单位是字节

#include<stdio.h>
int main()
{
	int a= -10;
	printf("%d\n", sizeof(a));//计算的是a所占内存的大小
	return 0;
}

如果括号里面放数组

计算的是整个数组的大小

#include<stdio.h>
int main()
{
	int arr[5];
	printf("%d\n", sizeof(arr));//计算的是a所占内存的大小
	return 0;
}

网站公告

今日签到

点亮在社区的每一天
去签到