6.C操作符详解,深入探索操作符与字符串处理

devtools/2024/11/19 9:13:24/

C操作符详解,深入探索操作符与字符串处理

C语言往期系列文章目录

往期回顾:

  1. C语言是什么?编程界的‘常青树’,它的辉煌你不可不知
  2. VS 2022 社区版C语言的安装教程,不要再卡在下载0B/s啦
  3. C语言入门:解锁基础概念,动手实现首个C程序
  4. C语言概念之旅:解锁关键字,字符,字符串的秘密,揭秘语句和注释,程序员的宝藏
  5. C语言基础入门:数据类型、变量声明与创建详解

文章目录


前言

在上一篇,我们深入探讨了C语言中的数据类型和变量声明与创建,从丰富的数据类型到变量的创建、初始化和分类,这些知识为我们进一步学习C语言奠定了坚实的基础。现在,我们已经站在了C语言世界的门口,窥见了其内部的无限可能。接下来的博客,我们将继续深入C语言的精髓,一起迈向更深层次的编程之旅。


一、如何求字符串长度

上期学完数据结构类型后,我们这期从如何求字符串长度开始?
假设有一个字符“abc”,那我们如何求出这个字符串长度呢?其实,在我们的C语言库中,有一个函数叫做strlen函数。

strlen - string length

代码演示:

#include <stdio.h>
#include <string.h>int main()
{int len = strlen("abc");//abc\0printf("%d\n", len);return 0;
}

但我们运行起来在vs中会看到报错。
在这里插入图片描述
其实我们还有个叫sizeof的函数,它返回的数据类型就是size_t。size_t就是unsigned int。
我们想要计算路径长度呢?

	int len = strlen("F:\Users\YunShanRuo\Desktop\1.docx");printf("%d\n", len);

这时候我们会发现出了问题,在这里插入图片描述
可以看到结果是30。这里是因为转义字符出了问题。通过这个例子重点是学会能够看出转义字符的作用。

二、算术操作符:+,-,*,/,%

写代码我们一定会涉及到算数,那为了计算,C语言提供了一些操作符操作符呢也被称为运算符,不同的人对它的翻译是不一样的。有人叫他操作符,也有人叫它运算符,那其中有一组操作符叫:算术操作符。分别是: +、 - 、*、\ 、% ,都是双目操作符

2.1 双目操作符

这些操作符又被称为,双目操作符。我们拿+号举例。

5 + 6

这个+号的左边是一个操作数,右边也是一个操作数,位于操作符两端的就是它们的操作数,我们把这样的操作符,叫做双目操作符

2.1.1 + 和 -

运算符‘+’ 和 ‘-’ 是用来完成加法和减法的,它们都有两个操作数,位于操作符的两端就是它的操作数。
代码演示:

int main()
{int num1 = 3 + 7;printf("%d\n", num1);int num2 = 3 - 7;printf("%d\n", num2);return 0;
}

除此之外,变量还可以相加。

	          //10  -4int sum = num1 + num2;printf("%d\n", sum);

2.1.2 *

运算符 * ⽤来完成乘法。

int main()
{int n = 5;printf("%d\n", n * n);return 0;
}

2.1.3 /

运算符 / ⽤来完成除法。但是在C语言中又分整数除法浮点数除法。除号的两端如果是整数,执⾏的是整数除法,得到的结果也是整数。
代码演示:
7 / 2 得到整数3 余数 1,这个是整数除法。

int main()
{int a = 7 / 2;//7/2=3...1printf("a = %f\n", a);printf("a = %d\n", a);return 0;
}

在屏幕上运行打印的结果,一个是3.000000,一个是3,无法得到我们想要的3.5.这时候我们就要执行浮点数除法了。
除号的两端,两个运算数必须至少有⼀个浮点数,这时C语言执行的是浮点数除法,得到的结果就是浮点数。

int main()
{float a = 7.0f / 2.0f;//7/2=3...1printf("a = %f\n", a);return 0;
}

练习题:
这段代码的结果是什么?

#include <stdio.h>int main()
{int score = 5;score = (score / 20) * 100;return 0;
}

结果是0.
如果我们改成20.0,那么这段代码的运行结果就变成了25.

#include <stdio.h>int main()
{int score = 5;score = (score / 20.0) * 100;printf("%f\n",score);return 0;
}

2.1.4 %

运算符 % 表示求模运算,即返回两个整数相除的余值。这个运算符只能用于整数,不能用于浮点数。
我们如何理解呢?其实说白了,这个就是在求余数。

	int a = 7 / 2;//商int b = 7 % 2;//%取模(取余)得到是是整除后的余数printf("a=%d\n", a);printf("b=%d\n", b);

注意:取余没有浮点数的取法。也就是说取余最终操作的还是整数。
负数取余
负数求模的规则是,结果的正负号由第一个运算数的正负号决定。

#include <stdio.h>int main()
{printf("%d\n", 11 % -5); // 1printf("%d\n",-11 % -5); // -1printf("%d\n",-11 % 5); // -1return 0;
}

我们可以看到,最终结果的正负号,都是由第一个数的正负号决定的。

三、赋值操作符:=和复合赋值

在变量创建的时候给一个初始值叫初始化,在变量创建好后,再给一个值,这叫赋值。

	int a = 0;//初始化a = 20;//赋值,= 赋值操作符

赋值操作符 = 是一个随时可以给变量赋值的操作符

3.1 连续赋值

赋值操作符也可以连续赋值,如:

	int a = 3;int b = 5;int c = 0;c = b = a + 3;//连续赋值,从右向左依次赋值的。

C语言虽然支持这种连续赋值,但是写出的代码不容易理解,也不方便调试,建议还是拆开来写,这样方便观察代码的执行细节。

	b = a + 3;c = b;

3.2 复合赋值

在写代码时,我们经常可能对一个数进行自增、自减的操作,如下代码:
比如现在有个a,然后我们想让它增加10

	int a = 3;a = a + 10;

像这样的过程我们可以简化,简化成+=,或者说是-=。像这样的复合赋值操作符有+=、-=、*=、/=、%=……

	int a = 3;a = a + 10;a += 10;//复合赋值a = a - 4;a -= 4;//复合赋值

还有这些也是复合赋值运算符。
在这里插入图片描述

4. 单目操作符:++,-- ,+,-

我们回过头来想一下,前面我们学的双目操作符,是因为他有两个操作数,而现在我们介绍的单目操作符,是不是意味着它只有一个操作数。而,++、–、+(正)、-(负) 就是单目操作符的。

4.1 ++ 和 –

++分前置++和后置++,- - 也分前置 - - 和后置 - - 。++ 就是自增1 的运算。

	a = a + 1a += 1a++ / ++a

前置和后置的区别是什么呢?我们得放在表达式中才能观察。

4.1.1 前置++和后置++

对于前置++的计算,我们有一个计算口诀:先++,后使用。

	int a = 5;int b = ++a;//a=a+1;b=a;printf("a=%d\n", a);//6printf("b=%d\n", b);//6

对比一下后置呢?我们同样有一个计算口诀。后置++,它的计算口诀:先使用,再++。

	int a = 5;int b = a++;//b=a;a=a+1;printf("a=%d\n", a);//6printf("b=%d\n", b);//5

4.1.2 前置- -和后置 - -

前置- - 和后置- -的各自计算同样有自己对应的口诀。前置- -计算口诀:先 - -,后使用,后置是:先使用,再 - -

//前置--int a = 5;int b = --a;//a=a-1;b=a;printf("a=%d\n", a);//4printf("b=%d\n", b);//4
//后置--int a = 5;int b = a--;//b=a, a=a-1printf("a=%d\n", a);//4printf("b=%d\n", b);//5

4.2 +(正)和 -(负)

这里的+是正号,-是负号,都是单目操作符
运算符 + 对正负值没有影响,是一个完全可以省略的运算符,但是写了也不会报错。
+号加上不影响原先的值,也就是原先是负数后面还是负数。而-会改变原先值的正负号。

int main()
{int a = -10;int b = a;printf("%d\n", b);return 0;
}

运算符 – 用来改变一个值的正负号,负数的前面加上 - 就会得到正数,正数的前面加上 - 会得到负数。

5.强制类型转换

对于强制类型转换,不推荐大家频繁的用,我们之前在接触数据类型的时候看过,我们说可以把double的浮点数加一个’f’,从而变成float。
而这种就是强制类型转换,它的语法很简单,就是在括号中放类型。

int main()
{int a = (int)3.14;//doubleprintf("%d\n", a);return 0;
}

这时候只会打印,3,所以能不用强转就不用强转,强制类型转换也是个转换符。但其实操作符还没有讲完,之后还会进行详解。

总结

我们探讨了C语言中的字符串长度计算(strlen与sizeof)、算术操作符(+、-、*、/、%)、赋值操作符(=、+=等)及单目操作符(++、–、+、-)。同时,介绍了强制类型转换的注意事项。下期我们将介绍输入输出和分支循环。


http://www.ppmy.cn/devtools/135172.html

相关文章

Java LinkedList 详解

LinkedList 是 Java 集合框架中常用的数据结构之一&#xff0c;位于 java.util 包中。它实现了 List、Deque 和 Queue 接口&#xff0c;是一个双向链表结构&#xff0c;适合频繁的插入和删除操作。 1. LinkedList 的特点 数据结构&#xff1a;基于双向链表实现&#xff0c;每个…

QT中使用图表之QChart绘制柱状图

绘制条形&#xff08;柱状&#xff09;图&#xff0c;系列选择条形系列QBarSeries x轴选择条形图的种类轴QBarCategoryAxis 1、创建图表视图 //1、创建图表视图 QChartView * view new QChartView(this); //开启抗锯齿 view -> setRenderHint(QPainter::Antialiasing); …

vue自定义指令--一键复制

vue项目中想要实现点击按钮一键复制&#xff0c;可以通过vue的自定义指令directive来实现。 一、新建directive.js文件 新建directive.js文件&#xff0c;用于定义所有的自定义指令。 import { Toast } from vant;const directive {// 一键复制copy:{bind (el, { value }) …

日志采样标记算法

从日志中提取特征值: {0: (LDAP Built with OpenLDAP LDAP SDK, :), 1: (LDAP SSL support unavailable, :), 2: (suEXEC mechanism enabled lili wrapper /usr/sbin/suexec, ()/:), 3: (Digest generating secret for digest authentication ..., .:), 4: (Digest done…

第十一章 对Stream流的聚合函数处理

目录 一、对流中数据进行聚合计算 二、对流中数据进行分组 三、对流中数据进行多级分组 四、对流中数据进行分区 4.1. 使用方式及代码 4.2. 分区于分组的区别 分区&#xff08;Partitioning&#xff09; 分组&#xff08;Grouping&#xff09; 实际应用场景 五、对流…

20-大模型外挂知识库优化——负样本样本挖掘篇

大模型外挂知识库优化——负样本样本挖掘篇 一、为什么需要构建负难样本&#xff1f; 在各类检索任务中&#xff0c;为训练好一个高质量的检索模型&#xff0c;往往需要从大量的候选样本集合中采样高质量的负例&#xff0c;配合正例一起进行训练。 二、负难样本构建方法篇 …

WIFI-TTL透传模块说明书

WIFI-TTL透传模块说明书 V 1.0 2022-11-24 目录 1 简介... 4 2 模块参数... 4 3 接口定义... 5 4 设备配网... 6 5 AT指令... 11 6 恢复出厂... 12 7 设备配置... 13 7.1 配置界面说明... 13 7.2 TTL串口配置... 13 7.3 …

【Patroni官方文档】FAQ

FAQ&#xff08;常见问题解答&#xff09; 在本节中&#xff0c;您将找到关于Patroni的最常见问题的答案。每个小节都试图关注不同类型的问题。 我们希望这能帮助您澄清大部分问题。如果您仍然有进一步的疑虑或遇到意外问题&#xff0c;请参考“聊天和报告错误”部分&#xf…