4.C语言概念之旅:解锁关键字,字符,字符串的秘密,揭秘语句和注释,程序员的宝藏

news2024/10/10 8:16:22

C语言概念之旅:解锁关键字,字符,字符串的秘密,揭秘语句和注释,程序员的宝藏

C语言往期系列文章目录

往期回顾:

  1. C语言是什么?编程界的‘常青树’,它的辉煌你不可不知
  2. VS 2022 社区版C语言的安装教程,不要再卡在下载0B/s啦
  3. C语言入门:解锁基础概念,动手实现首个C程序

文章目录

  • C语言概念之旅:解锁关键字,字符,字符串的秘密,揭秘语句和注释,程序员的宝藏
  • C语言往期系列文章目录
  • 前言
  • 一、关键字介绍
  • 二、字符和ASCII编码
    • 2.1 ASCII码表
  • 三、字符串和\0
  • 四、转义字符
    • 4.1 三字母词
    • 4.2 常见问题
    • 4.3 \ddd 和 \xdd
  • 五、语句和语句分类
    • 5.1 空语句
    • 5.2 表达式语句
    • 5.3 函数调用语句
    • 5.4 复合语句
    • 5.5 控制语句
  • 六、注释
    • 6.1 注释的两种形式
      • 6.1.1 /\*……\*/
      • 6.1.2 //
    • 6.2 编译器的处理
  • 七、证明\0是字符串的结束标志
  • 总结


前言

上篇学习了我们的第一个C语言程序,也知道了printf是用来打印信息到屏幕上的,以及main函数和库函数的特点我们也了解了,本期涵盖了C语言的多个关键方面,从基础的关键字介绍到字符和ASCII编码,再到字符串、转义字符、语句分类以及注释等话题。每个部分都包含了相关的文章标题或编号,方便读者快速定位感兴趣的内容。

接下来,让我们一起深入探索C语言的奥秘,开启一段充满挑战与收获的编程之旅吧!


一、关键字介绍

C语言中有一批保留的名字的符号,比如: int 、 if 、 return ,这些符号被称为保留字或者关键字

C语言的32个关键字

注意,关键字都有以下特点:

  • 关键字都有特殊的意义,是保留给C语言使用的
  • 程序员自己在创建标识符的时候是不能和关键字重复的
  • 关键字也是不能自己创建的

其次,在C99标准中加入了 inline 、 restrict 、 _Bool 、 _Comploex 、 _Imaginary 等关
键字。我们可以通过 cplusplus 网站查询关键字链接,其余的关键字,我们在后面的学习过程中,会逐渐接触的。

二、字符和ASCII编码

我们可以发现,在我们的学习过程中,我们的键盘可以在屏幕上敲出各种字符,例如:abcdef、%、¥、*……等等字符,这些字符在C语言中是用 单引号 括起来的,‘a’、‘b’、‘%’……
那它们在计算机中是如何存储的呢?计算机能够识别的是二进制,而数据在存储的时候也是二进制。那这些英文字母是如何存储的呢?
其实这些字符在计算机中的存储依赖于一种编码方案,其中最广泛使用的是ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)编码。ASCII编码为英文字母、数字和一些特殊符号分配了唯一的数字代码,这些代码以二进制形式存储。
对于ASCII码表,我们只需要记住常用的就行了。

常用的ASCII码如下:
在这里插入图片描述
我们可以用以下代码来打印这些字符

//C语言字符的演示
#include <stdio.h>

int main()
{
	//32-127
	int i = 0;
	for (i = 32; i <= 127; i++)
	{
		if (i % 16 == 0)
			printf("\n");
		printf("%c ", i);
	}
	return 0;
}

结果如下:

在这里插入图片描述
我们要打印出字符,我们就得用%c来打印,这个在第三篇当中我们就了解过了占位符的概念。

2.1 ASCII码表

ASCII码可以在cplusplus网站查询 (链接)
在这里插入图片描述

三、字符串和\0

刚刚我们说,字符是用单引号’'括起来的,例如:‘a’,‘b’……,那什么样算字符串呢?我们看下述代码

//字符和字符串
int main()
{
	//字符
	'a';
	'b';
	'c';
	//字符串
	"abc";
	"";//空字符串
	return 0;
}

C语言中是如何表示字符串呢?使用双引号括起来的一串字符就被称为字符串,如:“abcdef”,就是⼀个字符串。

字符串的打印,我们既可以直接用printf打印,也可以使用占位符 %s 来指定,如下所示:

//字符串的打印
#include<stdio.h>

int main()
{
	printf("hello world\n");
	printf("%s\n", "hello world");
	
	return 0;
}

其实C语⾔字符串中有⼀个特殊的知识,就是在字符串的末尾隐藏放着⼀个 \0 字符,这个 \0 字符是字符串的结束标志。
在VS 2022 社区版中,我们可以打开监视看到 \0 字符。

在这里插入图片描述
对于字符串"hello world",我们实际上看到了11个字符:h,e.l.l,o, ,w,o,r,l,d。但是实际上在未尾还隐藏一个\0的转义字符,\0是字符串的结束标志。所以我们在使用库函数 printf()打印字符串或者strlen()计算字符串长度的时候,遇到\0的时候就自动停止了。
在文章的末尾我会给大家验证,\0 是字符串结束的标志。

四、转义字符

也许在前面的代码中,看到 \n , \0 的时候很纳闷,这啥玩意,是干什么的。其实在字符中有一组特殊的字符,它们叫转义字符,顾名思义呢,就是转变原来的意思的字符。
就比如下面的两段代码:

//转义字符
//代码1
int main()
{
	printf("abcdnef");
	return 0;
}

//代码2
int main()
{
	printf("abcd\nef");
	return 0;
}

上述代码的对比如图所示,可以看到字母n被转义了,变成了\n,它的作用其实是换行。
在这里插入图片描述
那像这样的转义字符还有很多。

在这里插入图片描述
我们就讲几个特殊的概念

4.1 三字母词

三字母词是C语言早期版本中的一种特性,用于在缺少某些字符集的计算机上表示特殊字符。然而,这一特性在现代C语言中已不再常用,且许多编译器可能不再支持。

//三字母词
??) -> ]
??( -> [

三字母词在被编译的时候会被转换成一个字符,例如下面这段代码

printf("(are you ok??)");

这段代码的输出结果就会变成,are you ok],实际我们想输出are you ok??),这个时候我们想输出我们想要的片段就得把前面的两个问号单独转义变成 \? \? ) ,这样这个三字母词就不会被转义成 ] 了。

在这里插入图片描述

4.2 常见问题

在转义字符上,我们也常常遇到一些问题,这时候我也整理了一些问题出来

问题1:想打印单字符常量发现出现问题,无法识别

例如下面这段代码:

//错误示例
int main()
{	
	printf("%c",''');
	return 0;
}

这是因为左边的两个被识别成一对了,后面一个无法识别,而我们本意是想打印一个单字符常量。
这时候我们就需要把中间的这个单字符常量变成转义字符。

//正确示例
int main()
{	
	printf("%c",'\'');
	return 0;
}

问题2:想打印路径发现出现问题,无法打印出完整路径

//错误示例
int main()
{	
	printf("C:\Users\YunShanRuo\source\repos\Question");
	return 0;
}

这是我的某个路径,我们可以发现,运行结果是一堆我根本看不懂的东西

在这里插入图片描述
这时候,我们可以加两个斜杠

//正确示例
int main()
{
	printf("C:\\Users\\YunShanRuo\\source\\repos\\Question");
	return 0;
}

这样,我们打印的时候就不会出问题了,当然在某些编译器上,如果遇到路径有问题,可以使用/来表示路径,因为一些编译器是支持识别的。

4.3 \ddd 和 \xdd

\ddd 和 \xdd 实际是一个进制的表示法,如图所示
在这里插入图片描述

\ddd

  • 定义:\ddd 表示1~3个八进制数字。在计算机编程中,这种表示法常用于字符编码,特别是当需要表示一些特殊字符或控制字符时。
  • 原理: 当编译器遇到 \ddd 这样的转义序列时,它会将 \ 后面的八进制数字转换成对应的十进制ASCII值,然后输出该ASCII值所代表的字符。
  • 示例: 例如,\101 表示八进制数101,转换成十进制是65,而ASCII码65对应的是大写字母A。因此,\101 在输出时会被替换为大写字母A。

\xdd

  • 定义:\xdd 表示两个十六进制数字。与 \ddd 类似,这种表示法也用于字符编码。
  • 原理: 编译器会将 \x 后面的十六进制数字转换成对应的十进制ASCII值,并输出该ASCII值所代表的字符。
  • 示例: 例如,\x41 表示十六进制数41,转换成十进制是65,ASCII码65对应的是大写字母A。因此,\x41 在输出时会被替换为大写字母A。

五、语句和语句分类

C语言的代码是由一条一条语句构成的,那什么是语句呢?
如果我们笼统一点说的话,一个分号就是一条语句
C语言的语句分为以下的五大类:

5.1 空语句

空语句是最简单的语句,因为它一个分号就是一条空语句。

#include<stdio.h>
//空语句演示
int main()
{
	;//这是一个空语句
	return 0;
}

空语句,⼀般出现的地方是:这里需要⼀条语句,但是这个语句不需要做任何事,就可以写⼀个空语句。

5.2 表达式语句

表达式语句就是在表达式的后边加上分号。如下所示:

#include<stdio.h>
//表达式语句演示
int main()
{
	int a = 5;
	int b = 5;
	b = a + 5 ;//这是一个表达式语句
	return 0;
}

5.3 函数调用语句

函数我们之后会学,我们可以提前看看函数调用语句是什么样子的。

#include <stdio.h>

int Add(int x, int y)
{
	return x + y;
}

int main()
{
	printf("hehe\n");//这也是一个函数调用语句(调用库函数printf)
	int ret = Add(2, 3);//这是一个函数调用语句
	return 0;
}

5.4 复合语句

多条语句组合在一起就叫复合语句,也就是代码块,成对括号中的代码就构成⼀个代码块,也被称为复合语句。

#include <stdio.h>

int Add(int x, int y)//函数的⼤括号中的代码也构成复合语句
{
	return x + y;
}

int main()
{
	int i = 0;
	for(i=0; i<10; i++) //for循环的循环体的⼤括号中的就是复合语句
	{
		printf("%d ", i);
	}
	return 0;
}

5.5 控制语句

控制语句用于控制程序的执行流程,以实现程序的各种结构方式(C语言支持三种结构:顺序结构、选择结构、循环结构),它们由特定的语句定义符组成,C语⾔有九种控制语句。
可分成以下三类:

  1. 条件判断语句也叫分支语句:if 语句、switch 语句;
  2. 循环执行语句:do……while 语句、while 语句、for 语句;
  3. 转向语句:break 语句、goto 语句、continue 语句、return 语句。

我们之后写到分支循环的时候会一一介绍的,提前了解一下。

六、注释

注释是对代码的说明,编译器会忽略注释,也就是说,注释对实际代码没有影响。注释是给程序员自己,或者其他程序员看的。好的注释可以帮我们更好的理解代码,但是也不要过度注释,不要写没必要的注释。当然不写注释可能会让后期阅读代码的人抓狂。

6.1 注释的两种形式

以下片段来自《高质量 C++/C 编程指南》

C 语言的注释符为“ //”。 C++语言中,程序块的注释常采用“ //”,行注释 一般采用“ //…”。
注释通常用于:

(1)版本、版权声明;
(2)函数接口说明;
(3)重要的代码行或段落提示。

虽然注释有助于理解代码,但注意不可过多地使用注释。

6.1.1 /*……*/

//注释演示
/*
#include<stdio.h>
//正确示例
int main()
{
	printf("c:\\users\\yunshanruo\\source\\repos\\question");
	return 0;
}
*/

在我们的VS2022 上可以看到上述代码都变绿色了,这样就代表我们注释了这一段代码。这种注释方式也有缺陷,如下所示:

//注释演示
/*
#include<stdio.h>
//正确示例
int main()
{
	/*
	printf("c:\\users\\yunshanruo\\source\\repos\\question");
	return 0;
	*/
}
*/

第一个/* 只会匹配到return 0 ; 之后的 */ ,而不会匹配到末尾的注释符号。

6.1.2 //

// 是C99标准才引入的一种注释方式,它有个坏处,就是只能注释一行。

注释演示
//#include<stdio.h>
正确示例
//int main()
//{
//
//	printf("c:\\users\\yunshanruo\\source\\repos\\question");
//	return 0;
//
//}

6.2 编译器的处理

注意,编译的时候,我们的注释会被替换成空格,所以注释在某些情况下,不能乱用。就比如下面这段代码:

int main()
{
	int n/**/um = 10; //报错语句
	return 0;
}

这里的num 实际上会被编译器处理成 n [空格] um , 编译器看到这段的时候就蒙了,n um = 10;就无法正常识别,所以注释使用的时候还是要注意一些。

七、证明\0是字符串的结束标志

要证明 \0 是字符串的结束标志,我们就得用一个概念,数组,顾名思义,数组就是一组数据。接下来就让我用代码来验证一下:

//验证'\0'是结束标志。
#include<stdio.h>

int main()
{
	char arr1[] = "hello world";
	char arr2[] = { 'a','b','c'};
	
	printf("%s\n", arr1);
	printf("%s\n", arr2);

	return 0;
}

结果如下:

在这里插入图片描述
这两个数组其实是有差距的。没有\0的数组打印乱码。我们可以通过调试来观察数组:

在这里插入图片描述
我们发现数组,arr1的末尾是有 \0 的,它的打印是正常的,arr2的末尾是没有 \0 的,它的打印是不正常的。它们的存储是什么样的?如下图所示:

在这里插入图片描述
那如果arr2的末尾也有 \0 ,那打印是否正常了呢?我们将代码改成下述片段:

//验证'\0'是结束标志。
#include<stdio.h>
int main()
{
	char arr1[] = "hello world";
	char arr2[] = { 'a','b','c','\0'};
	
	printf("%s\n", arr1);
	printf("%s\n", arr2);

	return 0;
}

按下F5,观察结果

在这里插入图片描述
因此我们可以发现,当字符串的末尾有 \0时,printf遇到就对自动停止打印,而没有,就会继续打印下去,直到停止打印,而这部分通常以乱码的形式呈现给我们。所以空字符 ‘\0’ 在C语言中作为字符串的结束标志起着至关重要的作用,它确保了字符串能够被正确地处理和打印。在处理字符时,一定要考虑 \0 的存在。

总结

通过本文章的学习,我们深入了解了C语言的关键字、字符编码、字符串处理、转义字符、语句分类以及注释等核心概念。我们学会了如何使用这些基础知识来编写功能强大的C语言程序,并尝试掌握了良好的编程习惯和思维方式。希望读者朋友们能够继续深化对C语言的理解和运用,为未来的编程之路打下坚实的基础。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2201508.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java | Leetcode Java题解之第468题验证IP地址

题目&#xff1a; 题解&#xff1a; class Solution {public String validIPAddress(String queryIP) {if (queryIP.indexOf(.) > 0) {// IPv4int last -1;for (int i 0; i < 4; i) {int cur (i 3 ? queryIP.length() : queryIP.indexOf(., last 1));if (cur <…

优雅的实现服务调用 -- OpenFeign

文章目录 1. RestTemplate存在问题2. OpenFeign介绍3. 快速上手引入依赖添加注解编写OpenFeign的客户端远程调用 4. OpenFeign参数传递从URL中获取参数传递单个参数传递多个参数传递对象传递JSON 5. 最佳实践Feign继承方式创建一个新的模块引入依赖编写接口打jar包服务实现方实…

锐龙7 7800X3D与i7-14700K到底怎么选!其实很简单

从2022年的锐龙7 5800X3D到后来的锐龙7 7800X3D&#xff0c;笔者使用X3D处理器已有2年多的时间。站在自己的立场&#xff0c;我是非常希望游戏老鸟购买这类处理器的&#xff0c;并且也推荐了不少。 这里说的是老鸟&#xff0c;也就是比较懂电脑的玩家。 但是对于新手玩家而言&a…

Canal 扩展篇(阿里开源用于数据同步备份,监控表和表字段(日志))

1.Canal介绍 Canal把自己伪装成从数据库&#xff0c;获取mysql主数据库的日志&#xff08;binlog&#xff09;信息&#xff0c;所以要想使用canal就得先开启数据库日志 https://github.com/alibaba/canal Canal 主要用途是基于 MySQL 数据库增量日志解析&#xff0c;提供增量…

刷题 链表

面试经典150题 - 链表 141. 环形链表 class Solution { public:bool hasCycle(ListNode *head) {ListNode* slow head, *fast head;while (fast ! nullptr && fast->next ! nullptr) {slow slow->next;fast fast->next->next;if (slow fast) {return…

maven加载依赖成功但是引入import不了包,注解报错

突然就复现不出来了&#xff0c;奇了怪了&#xff0c;简单说一下吧&#xff0c;就是模块里引入了SpringBoot Test那个依赖然后&#xff0c; 这个地方是显示引入成功的&#xff0c;但是 这个包下没有&#xff0c;导致我SpringBootTest一直出不来&#xff0c;就找不到这个包下的注…

【一步步开发AI运动小程序】二十、AI运动小程序如何适配相机全屏模式?

引言 受小程序camera组件预览和抽帧图像不一致的特性影响&#xff0c;一直未全功能支持全屏模式&#xff0c;详见本系列文件第四节[小程序如何抽帧]https://blog.csdn.net/alphaair/article/details/133981787 “小程序如何抽帧”)&#xff1b;随着插件在云上赛事、健身锻炼、A…

一个神奇的 Python 库:flanker-next

文章目录 一个神奇的 Python 库&#xff1a;flanker-next背景介绍库简介安装指南函数使用示例解析邮箱地址验证邮箱地址解析 MIME 消息 应用场景自动化邮件处理邮件内容分析客户支持自动化 常见问题及解决方案问题1&#xff1a;解析无效的电子邮件地址问题2&#xff1a;无法找到…

1992-2022年各省夜间灯光数据(excel+shp格式)

1992-2022年各省夜间灯光数据&#xff08;excelshp格式&#xff09; 1、时间&#xff1a;1992-2022年 2、来源&#xff1a; DMSP-OLS、NPP-VIIRS 3、指标&#xff1a;均值、总和、最小值、最大值、标准差 4、范围&#xff1a;34省市&#xff08;含港澳台&#xff09; 5、说…

(25)QPSK信号在AWGN和Rayleigh衰落信道下的性能仿真

文章目录 前言一、MATLAB仿真代码二、仿真结果 前言 QPSK信号在AWGN和Rayleigh衰落信道下的性能仿真MATLAB代码。 一、MATLAB仿真代码 代码如下&#xff1a; nSamp 8; % 矩形脉冲的采样点数 nSymbol 1000000; % 传输的符号…

GPT-SOVIT模型部署指南

一、模型介绍 强大的小样本语音转换和文本转语音 WebUI。 具有以下特征&#xff1a; 零样本 TTS&#xff1a; 输入 5 秒的声音样本并体验即时文本到语音的转换。少量样本 TTS&#xff1a; 仅使用 1 分钟的训练数据对模型进行微调&#xff0c;以提高语音相似度和真实感。跨语…

QD1-P11 HTML常用标签:图片标签

本节学习 HTML 常用标签&#xff1a;图片标签 img ‍ 本节视频 www.bilibili.com/video/BV1n64y1U7oj?p11 ‍ 知识点 1&#xff1a;img 是行内标签 img 是一个行内标签&#xff0c;不会自动换行。 知识点 2&#xff1a;img 标签使用格式 <img src"图片URL" a…

Leetcode 删除链表倒数第 N 个节点

算法思想&#xff1a; 使用了双指针法。下面是详细的算法思想&#xff1a; 1. 引入虚拟头节点&#xff08;dummy node&#xff09; 为了处理链表的一些边界情况&#xff08;比如删除头节点&#xff09;&#xff0c;我们在链表的头部引入了一个虚拟节点 dummy&#xff0c;并让…

点评项目-5-商户查询缓存,从 2s 优化到 12ms

业务需求&#xff1a;当前端发送 shop/id 的请求时&#xff0c;我们需要向前端响应对应 id 的详细数据给前端 直接查询 mysql 效率比较低&#xff0c;我们可以使用 redis 作为中间件进行数据的缓存&#xff0c;先查询 redis &#xff0c;若redis 中未查询到&#xff0c;则在 m…

24.3 基于文件的服务发现模式

本节重点介绍 : 基于文件的服务发现提供了一种配置静态目标的更通用的方法可以摆脱对特定服务发现源的依赖通常的做法是调用内部CMDB的接口获取target数据&#xff0c;打上标签&#xff0c;生成json文件发给prometheus采集 基于文件的服务发现模式 解决的问题 之前手动配置…

视频声音怎么去除?高效的视频声音去除方法

视频声音怎么去除&#xff1f;在多媒体创作与编辑的过程中&#xff0c;我们时常会遇到这样一个需求&#xff1a;为了使用视频素材&#xff0c;需要去除视频里的声音。这一步骤看似简单&#xff0c;实则对于提升作品的整体质量和专业度至关重要。很多时候&#xff0c;我们收集到…

人工智能风险预警以及区块链解决方案探索

​​发表时间&#xff1a;2024年9月26日 一个专家小组在为世界经济论坛撰写的报告中警示道&#xff0c;人工智能&#xff08;以下均简称为AI&#xff09;技术增加了各类组织遭受攻击的风险&#xff0c;并带来了训练数据污染和提示词注入攻击等新威胁。由于训练和测试数据库的庞…

VmWare中安装CenterOs(内网服务器)

VmWare中安装CenterOs(内网服务器) 文章目录 VmWare中安装CenterOs(内网服务器)[toc] 一 、CentOS 7的下载与安装1、下载2、安装&#xff08;1&#xff09;前期准备&#xff08;2&#xff09;正式安装 开始等待&#xff01;&#xff01;&#xff01; 二、软件仓库更换1、root用…

openmmlab实现图像超分辨率重构

文章目录 前言一、图像超分辨率重构简介二、mmmagic实现图像超分 前言 超分辨率重构技术&#xff0c;作为计算机视觉领域的一项重要研究课题&#xff0c;近年来受到了广泛关注。随着科技的飞速发展&#xff0c;人们对图像质量的要求越来越高&#xff0c;尤其是在智能手机、监控…

使用idea和vecode创建vue项目并启动(超详细)

一、idea创建vue项目 创建项目之前先下载好插件 新建项目找到vue生成器 写好名称&#xff0c;找到自己需要存放的地址&#xff0c;node解释器安装方式可以看我上一个博客&#xff0c;vueCLI是选择vue的版本&#xff0c;我们可以使用idea自带的vue版本默认是vue3&#xff0c;创…