初阶C语言——详解操作符(1)

Hello,我们又见面了,最近不知道大家是否在持续输出代码呢?代码能力是否提高了呢?今天让我们来一起学习操作符,操作符在我们学习语言中很重要,我们要知道每个操作符的作用和用法,下面开始我们的学习。

  1. 操作符分类:

算术操作符
移位操作符
位操作符
赋值操作符
单目操作符
关系操作符
逻辑操作符
条件操作符
逗号表达式
下标引用、函数调用和结构成员

2算数操作符

     +    -   *   /     %

加(+) 减(-) 乘(*)和数学的一样,和大家讲一讲除(/)和取模(%)的用法。

#include<stdio.h>
int main()
{
	float a = 5 / 2;
	printf("%f", a);
	return 0;
}

在这里插入图片描述
我们可以看到虽然是浮点型,但是求出来的不是我们想要结果,这是为什么呢

原因是我们要求小数点的后面位的时候,5和2必须要有一个小数,比如5.0或者2.0,让我们加上看一看结果吧

#include<stdio.h>
int main()
{
	float a = 5 .0/ 2;
	printf("%f", a);
	return 0;
}

在这里插入图片描述
还有我们的取模符号

首先取模符号左边和右边必须是整型,结果是余数

#include<stdio.h>
int main()
{
	int a = 9 % 2;
	printf("%d", a);
	return 0;
}

这样写就对了

1. 除了 % 操作符之外,其他的几个操作符可以作用于整数和浮点数。
2. 对于 / 操作符如果两个操作数都为整数,执行整数除法。而只要有浮点数执行的就是浮点数除法。
3. % 操作符的两个操作数必须为整数。返回的是整除之后的余数。

3. 移位操作符

在讲位移操作符的时候我们得先了解一个东西,那就是二进制,因为我们的移位操作符操作的是二进制的补码

我们的整数是可以用二进制来表示的,整数的二进制有三种表达形式,分别是
原码
反码
补码
其中正数的二进制,反码补码原码都相等,但是负数的不相等
负整数数的反码是原码符号位不变,其余按位取反,补码是反码加1

下面举几个例子来让大家更好的了解二进制

大家可能对二进制的计算不是特别明白,但是大家肯定知道十进制,十进制就是我们生活中常用的数字,满十进一位,就像9到10一样,那我们的二进制也是一样,满2就往前进一位,比如111就是十进制的7
在这里插入图片描述
计算结果就是我们常用的十进制

我们简单了解二级制位,那么让我们来看一看原码反码补码
在这里插入图片描述
正整数的原码反码补码是一样的,比如5的原码是

00000000000000000000000000000101 原码
00000000000000000000000000000101 反码
00000000000000000000000000000101 补码

而我们的位移操作符是对二进制的补码进行操作的
左移操作符<<

#include<stdio.h>
int main()
{
	int a = 5<<1;

	printf("%d", a);
	return 0;
}

在这里插入图片描述
在这里插入图片描述

学会正整数的左移操作符,让我们来学习一下负数的吧

#include<stdio.h>
int main()
{
	int a = -5 << 1;

	printf("%d", a);
	return 0;
}

在这里插入图片描述
这样解释大家一定明白了吧,所以左移的规则是右边舍弃,左边加0。
右移操作符>>
右边操作符和左移也差不多

  1. 逻辑移位
    左边用0填充,右边丢弃
  2. 算术移位
    左边用原该值的符号位填充,右边丢弃

下面举个例子

#include<stdio.h>
int main()
{
	int a = 5 >> 1;

	printf("%d", a);
	return 0;
}

在这里插入图片描述
算数移位的右边是加符号位

补充:补码变成反码也可以先取反然后加1,符号位不变

警告:对于移位运算符,不要移动负数位,这个是标准未定义的。

int num = 10;
num>>-1;//error

4. 位操作符

& //按位与
| //按位或
^ //按位异或

首先他们操作的都是整数

  • 按位与&
#include<stdio.h>
int main()
{
	int a = 5 & 3;

	printf("%d", a);
	return 0;
}

在这里插入图片描述
这里的按位与我们可以这样理解,首先我们要把他们的二进制位都写出来,就像上面的一样然后对齐,有一个0的结果就是0,全部为1的才是1。

  • 按位或|
#include<stdio.h>
int main()
{
	int a = -1|3;

	printf("%d", a);
	return 0;
}

在这里插入图片描述

所以按位或是有一个1就是1

  • 按位异或
#include<stdio.h>
int main()
{
	int a = -1^3;

	printf("%d", a);
	return 0;
}

在这里插入图片描述

这样我们就位操作符讲明白了,在给大家补充一点,这些操作符都是双目操作符,什么是双目操作符呢,比如3&5,&两边的操作数分别是3和5,那么&就是双目操作符,大家看到&是不是会想到取地址符号,当然他们肯定是不同的,取地址&是个单目操作符

下面是一个笔试题,不能创建临时变量(第三个临时变量)来交换数

#include<stdio.h>
int main()

{
	int a = 20;
	int b = 10;
	a = a ^ b;
	b = a ^ b;
	a = a ^ b;
	printf("%d %d", a, b);
	return 0;
}

5. 赋值操作符

int weight = 120;//体重
weight = 89;//不满意就赋值
double salary = 10000.0;
salary = 20000.0;//使用赋值操作符赋值。
赋值操作符可以连续使用,比如:
int a = 10;
int x = 0;
int y = 20;
a = x = y+1;//连续赋值
这样的代码感觉怎么样?
那同样的语义,你看看:
x = y+1;
a = x;
这样的写法是不是更加清晰爽朗而且易于调试。

所以我们在给我们的变量赋值的时候一定要看起来至少能让人明白a = x = y+1像这个代码的话先把y+1赋值给x在赋值给y,这样的可读性并没有分开赋值看起来的明白
复合赋值符
在这里插入图片描述
6. 单目操作符
在这里插入图片描述

逻辑反操作

相当于把真变成假,把假变成真比如我的if函数中if(1)就是真,但是我们如果加上!就变成if(!1)就是逻辑假

负值和正值
插入一个代码大家马上就能理解

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

编译器显示的答案就是4
正值就和我们的正数一样

  • . 取地址&

就是取出该变量在我们内存的位置

  • sizeof
#include <stdio.h>
int main()
{
 int a = -10;
 int *p = NULL;//定义为空指针
 printf("%d\n", !2);
 printf("%d\n", !0);
 a = -a;
 p = &a;
 printf("%d\n", sizeof(a));
 printf("%d\n", sizeof(int));
 printf("%d\n", sizeof a);//这样写行不行?可以
 printf("%d\n", sizeof int);//这样写行不行?答案是不能
 return 0;
}

在X86编译器下地址的字节是4位,在64位的平台下,字节大小是8位

sizeof中最难的就是和数组组合,因为大家可能总是会有一个误解,举个例子给大家。

#include <stdio.h>
void test1(int arr[])
{
	printf("%d\n", sizeof(arr));//(2)
}
void test2(char ch[])
{
	printf("%d\n", sizeof(ch));//(4)
}
int main()
{
	int arr[10] = { 0 };
	char ch[10] = { 0 };
	printf("%d\n", sizeof(arr));//(1)
	printf("%d\n", sizeof(ch));//(3)
	test1(arr);
	test2(ch);
	return 0;
}
//问:
//(1)、(2)两个地方分别输出多少?
//(3)、(4)两个地方分别输出多少?

在这里插入图片描述
只要大家知道函数在传数组的时候传过去的首元素的地址,相信大家应该就能理解了,之前的文章也专门讲过,不会的往前看看就行了。

  • ~
    是按位取反,相当于把一个二进制数1的部分变成0,0的部分变成1
#include<stdio.h>
int main()
{
	int a = 2;
	printf("%d", ~a);
	return 0;
}

在这里插入图片描述

- 前置++和–
先++或者–然后再使用

#include<stdio.h>
int main()
{

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

	int a = 1;
	int b = --a;//a=a-1 b=a
	printf("%d %d", a, b);
	return 0;
}

后置++和–


#include<stdio.h>
int main()
{

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

	int a = 1;
	int b = a--;//b=a a=a-1
	printf("%d %d", a, b);
	return 0;
}

解引用操作符*

一般用在指针,比如想知道指针变量的内容的时候我们就可以用*来知道他的内容,大家是不是可以发现他和&取地址刚刚好相反

()这个符号是强制转换,举个简单的例子


#include<stdio.h>
int main()
{
	float a = 5.0;
	int c = (int)a / 2;
	printf("%d", c);
	return 0;
}

虽然是浮点型,但是经过我们的强制转换,最后a是一个整型

  • 7. 关系操作符
    在这里插入图片描述

警告:一定要区分==和=
今天的分享就到这里,期待下次和你们见面

评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

在冬天去看海

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值