【C语言趣味教程】(4) 变量:代码注释 | 变量的声明 | 初始化与赋值 | 变量的命名 | 关键字 | 标识符 | 变量名的命名规范

news2024/9/27 12:11:24

 🔗 《C语言趣味教程》👈 猛戳订阅!!!


Ⅰ. 代码注释(Comment)

0x00 引入:注释的作用

"程序员最讨厌两种人:一种是不写注释的人,一种是让我写注释的人。"

相信大家对注释早已有所耳闻,对于注释,C 语言有两种注释风格,我们下面会逐个讲解。

 

但在这之前,我们先来了解了解注释的作用,注释就是用于解释代码的文字的。

注释通常用于版本、版权声明,函数接口说明,重要的的代码行或段落提示。

它的存在能够有效提高代码的阅读性,注释不仅仅是给别人看的,也是给自己看的!

特别是写项目的时候。不写注释,几天后可能自己都不知道自己写了什么……

0x01 块注释  /*   */

块注释是 C 语言风格的注释,是一对 "斜杠星号"。

内容判定范围为从 /* 开始 到 */ 结束,是成对判定的。

/* 注释内容 */

它可以注释一行内容,也可以注释多行内容:

#include <stdio.h>

int main(void) 
{
	printf("你好!");   /* 打印你好 */

	return 0;
}

/*
	这是一套 C 语言趣味教学专栏,
	目前正在火热连载中,
	欢迎猛戳订阅!本专栏保证篇篇精品,
	继续保持本人一贯的幽默式写作风格,
	当然,在有趣的同时也同样会保证文章的质量,
	旨在能够产出 "有趣的干货" !
*/  int a;

最后的 int a 自然不在注释范围内,判定范围为从 /* 开始 到 */ 结束:

📌 注意:块注释不能嵌套注释:warning C4138: 在注释外找到“*/”  error C2059: 语法错误:“/

 0x02 行注释  //

行注释是 C++ 风格的注释,是两个斜杠。

内容判定范围从 // 开始到本行结束:

// 注释内容

行注释是非常方便快捷的,只需要在语句后面随手加两个斜杠就行:

#include <stdio.h>

int main(void) 
{
	printf("你好!");   // 打印你好

	return 0;
}

行注释是支持嵌套注释的,比如我们想把这里的 printf 这行注释掉:

#include <stdio.h>

int main(void) 
{
	// printf("你好!");   // 打印你好

	return 0;
}

❓ 那到底哪种注释风格好呢?

行注释和块注释 这两种注释风格并无好坏之分,可以混合使用。

在需要写大量说明的地方使用块注释(比如写函数功能),行内代码可以用行注释,方便快捷。

程序块注释常采用 /*  */ ,行注释一般采用 //,举个例子:

/*  启动一个新的线程,运行一个从FILENAME加载的用户程序。
 *  FILENAME中加载的用户程序。 这个新的线程可以在
 *  process_execute()返回之前被安排(甚至可以退出)
 *  在process_execute()返回之前。 返回新进程的
 *  线程ID,如果不能创建线程,则返回TID_ERROR。
 */
tid_t process_execute (
	const char *file_name     /* FILENAME 加载的程序 */
	)
{
	tid_t tid;                      // 记录线程ID 
	struct file *FILE = NULL;       // 创建file指针,用于 filesys_open 
	char* palloc_file_name = NULL;  // FILENAME 
	char* strtok_tmp;               // 临时存储FILENAME 
	char* ptr;                      // 用于字符串分割函数 

/*  这里创建一个FILE_NAME的副本,是为了阻止调用者与load()发生线程竞争。
 *  tips: 同一个进程中的线程能够共享进程中的绝大多数资源,当它们进行随意的竞争时,
 *  就会导致共享的资源被破坏、脏数据、不完整、不一致等问题。
 */
    // 创建一个FILENAME的副本,从用户或内核内存池中获取页 
	char* fn_copy = palloc_get_page (0);    
  	if (fn_copy == NULL) {                // 如果是空页,就返回线程ID错误信息
		return TID_ERROR;
	}

0x03 保持注释的美观性

在使用行注释时,我们一般习惯在 // 后面加一个空格,因为这样可能会更加美观:

在使用块注释写大量内容时,可以在每行都加上星号:

当然,这些归根结底都是按照个人习惯来。

就像小学学方程写未知数 x 时,老师并不会强制要求你怎么写。

Ⅱ. 变量(Variable)

  • 在讲解整型的章节中,我们已经对变量有一个简单的介绍了。本章我们将详细介绍变量,并且引入常量的知识点。

0x00 变量的声明

变量 (variable),顾名思义就是 "可以变的量"。

我们说过,C 语言的变量是由明确类型的,创建一个变量需要明确该变量的类型。

变量的声明方式有两种,第一种就是我们在前几章介绍的,通过 类型 + 变量名 定义一个变量:

数据类型 变量名;

💬 代码演示:定义变量

#include <stdio.h>
 
int main()
{
    int age;
    float height;
    double weight;
 
    return 0;
}

这种方式一行只定义一个变量,是最常见且推荐的变量声明方式。

0x01 多变量声明

C 语言还支持 多变量声明,即一行同时定义多个变量,类型 + 变量1, 变量2...

变量类型 变量1, 变量2, 变量3... ;

多变量声明时,变量和变量之间用逗号 ; 分隔。

使用多变量声明就意味着这一行要定义的变量的类型是相同的。

换句话来说,如果我们定义变量的类型都相同,我们就可以使用多变量声明一次定义多个变量。

💬 代码演示:使用多变量声明定义变量

#include <stdio.h>

int main()
{
    int a, b, c, d;  // 同时定义变量 abcd

    return 0;
}

 多变量声明还有更多的细节,我们稍后讲解完变量的初始化后再做探讨。

0x02 变量的初始化

变量 初始化 (initialization),就是在定义变量的同时给变量设置一个初始值,我们称为 "赋初值"。

数据类型 变量名 = 初始值;

建议在定义变量时给变量设置初始值,虽然不赋值也是允许的,但是我们不建议这么做!

int a = 0;   // 设置初始值
int b;       // 不推荐

比如我们定义整型变量 a,我们在定义的时候就随手给它设为 0,这就完成了赋初值的工作。

❓ 思考:如果不设置初始值会怎么样?

 如果定义变量没有初始化,那么变量有可能赋值,有可能没赋值。

如果定义的变量是局部变量,那么 编译器可能会给没赋值的初始变量赋一个 "随机值"。

不仅如此,如果你强行 printf 打印 a,会引来报错:error C4700: 使用了未初始化的局部变量“a” 

💬 代码演示:打印未初始化的变量

#include <stdio.h>

int main()
{
    int a;
    printf("%d\n", a);

    return 0;
}

 🚩 运行结果:error

所以我们需要培养一个好的编程习惯,在定义变量的同时,就给变量初始化。

并且我们 "习惯" 给变量初始值设为 0,下面给一些例子:

int a = 0;
char c = 0;
float f = 0.0;
double d = 0.0;

0x03 多变量声明的初始化

我们先来看下面的初始化,这是常规的初始化方法,创建变量 i, j, k 并初始化为 0

int i = 0;
int j = 0;
int k = 0;

现在 i, j, k 变量的值都为 0 了,我们刚才说了,C 语言支持多变量类型。

如果我们想达到相同的效果,多变量声明的初始化方式如下:

int i = 0, j = 0, k = 0;

 这样,我们的 i, j, k 的值在定义的同时就初始化为 0 了。

📌 注意:我们来看下面这种初始化方式

int main(void)
{
    int i, j, k = 0;

    return 0;
}

🚩 运行结果如下:(弹出 warning)

如果这么写,那么只有 k 设置了初始值 0,而 ij 是没有初始化的。

0x04 变量的赋值

给已经定义的变量设置一个值,或重新设置一个值,称为 赋值 (assignment) 。

如果我们在定义变量的时候没有给上初始值,我们可以在变量定义后给它赋上一个值:

int a;
a = 10;

通过赋值后,此时变量 a 就有值了。

当然,变量在定义的时候就完成初始化了,此时我们也可以给变量赋上一个新值:

int b = 0;   // 定义变量并初始化
b = 10; 

我们给 b 赋值后,此时变量 b 的值不是初始化给的 0 了,而是 10 了。

💬 代码演示:赋值前和赋值后

#include <stdio.h>

int main(void)
{
    int a = 0;
    printf("赋值前: %d\n", a);

    a = 10;
    printf("赋值后: %d\n", a);

    return 0;
}

🚩 运行结果如下:

当然,也是支持多变量赋值的:

#include <stdio.h>

int main(void)
{
    int a = 0, b = 0, c = 0;
    printf("赋值前: %d %d %d\n", a, b, c);

    a = 10, b = 20, c = 30;
    printf("赋值后: %d %d %d\n", a, b, c);

    return 0;
}

🚩 运行结果如下:

0x05 变量重定义引发的报错

 我们先看看下面的代码:

#include <stdio.h>

int main(void)
{
    int a;
    int a;

    int b = 10;
    int b = 20;

    return 0;
}

可以看到,变量 ab 定义了两次,这在 C 语言中是明令禁止的,引发 重定义问题

会引发如下报错:error C2086: “int a”: 重定义error C2374: “b”: 重定义;多次初始化

Ⅲ. 变量的命名(Variable Named)

0x00 关键字(保留字)

 下面是 C 语言提供的关键字,也可以称之为保留字。

保留字保留字,顾名思义这些字是需要保留的,一律不能作为常量名、变量名或标识符名。

① 基本关键字:

② C99 标准新增的关键字 (5个):

_Bool	
_Complex	
_Imaginary	
restrict
inline

③ C11 标准新增的关键字 (6个):

_Alignas	
_Alignof	
_Atomic	_Generic	
_Noreturn
_Static_assert	
_Thread_local

这些关键字是 C 语言提供的,你不能自己创建关键字。

这些关键字都不能作为变量名,因此我们在 给变量命名时必须避开关键字。

0x01 标识符

C 语言中,标识符用于标识变量、函数或项目名。标识符必须合法!

一个标识符允许字符 A-Z,a-z,下划线 _ 开头,跟零个或多个字母,下划线和 0~9。

💭 举个例子:下面的标识符都是合法的

student
StudentName
_windows
__array
cast_away
Sxc258
_1024

但是,标识符不能由数字开头:

123      ❌
0abc       ❌
45_name      ❌

并且,不允许出现标点字符和大部分特殊字符,比如 @, #, $, %, * 

$NAME   ❌
^name_a  ❌
@csdn.com    ❌

值得一提是,C语言是区分大小写的编程语言,因此 name 和 NAME 是两个完全不同的标识符。

0x03 变量的命名

📚 只需要记住:变量的命名,禁止使用关键字,并且必须使用合法的标识符。

int age = 18;
float _num = 1.24;

0x04 变量名的命名规范

待更新……

📌 [ 笔者 ]   王亦优 | 雷向明    
❌ [ 勘误 ]   /* 暂无 */
📜 [ 声明 ]   由于作者水平有限,本文有错误和不准确之处在所难免,
              本人也很想知道这些错误,恳望读者批评指正!
📃 [ 更新 ]   2023.7.8:完成初稿
              2024.7.10: 正式发布
              2023.7.28: 增添内容: 关键字和标识符的知识点

📜 参考文献:

- C++reference[EB/OL]. []. http://www.cplusplus.com/reference/.

- Microsoft. MSDN(Microsoft Developer Network)[EB/OL]. []. .

- 百度百科[EB/OL]. []. https://baike.baidu.com/.

- 维基百科[EB/OL]. []. https://zh.wikipedia.org/wiki/Wikipedia

- R. Neapolitan, Foundations of Algorithms (5th ed.), Jones & Bartlett, 2015.

- B. 比特科技. C/C++[EB/OL]. 2021[2021.8.31]

- 林锐博士. 《高质量C/C++编程指南》[M]. 1.0. 电子工业, 2001.7.24.

- 陈正冲. 《C语言深度解剖》[M]. 第三版. 北京航空航天大学出版社, 2019.

- 侯捷. 《STL源码剖析》[M]. 华中科技大学出版社, 2002.

- T. Cormen《算法导论》(第三版),麻省理工学院出版社,2009年。

- T. Roughgarden, Algorithms Illuminated, Part 1~3, Soundlikeyourself Publishing, 2018.

- J. Kleinberg&E. Tardos, Algorithm Design, Addison Wesley, 2005.

- R. Sedgewick&K. Wayne,《算法》(第四版),Addison-Wesley,2011

- S. Dasgupta,《算法》,McGraw-Hill教育出版社,2006。

- S. Baase&A. Van Gelder, Computer Algorithms: 设计与分析简介》,Addison Wesley,2000。

- E. Horowitz,《C语言中的数据结构基础》,计算机科学出版社,1993

- S. Skiena, The Algorithm Design Manual (2nd ed.), Springer, 2008.

- A. Aho, J. Hopcroft, and J. Ullman, Design and Analysis of Algorithms, Addison-Wesley, 1974.

- M. Weiss, Data Structure and Algorithm Analysis in C (2nd ed.), Pearson, 1997.

- A. Levitin, Introduction to the Design and Analysis of Algorithms, Addison Wesley, 2003. - A. Aho, J. 

- E. Horowitz, S. Sahni and S. Rajasekaran, Computer Algorithms/C++, Computer Science Press, 1997.

- R. Sedgewick, Algorithms in C: 第1-4部分(第三版),Addison-Wesley,1998

- R. Sedgewick,《C语言中的算法》。第5部分(第3版),Addison-Wesley,2002

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

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

相关文章

如何用DHTMLX组件为Web应用创建甘特图?(一)

dhtmlxGantt是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表。可满足项目管理应用程序的所有需求&#xff0c;是最完善的甘特图图表库。甘特图仍然是项目管理应用程序中最需要的工具之一&#xff0c;DHTMLX Gantt组件提供了能提升研发甘特图功能所需的重要工具。 在这篇…

【深度学习】InST,Inversion-Based Style Transfer with Diffusion Models,论文

代码&#xff1a;https://github.com/zyxElsa/InST 论文&#xff1a;https://arxiv.org/abs/2211.13203 文章目录 AbstractIntroductionRelated WorkImage style transferText-to-image synthesisInversion of diffusion models MethodOverview ExperimentsComparison with Sty…

我的第一个后端项目(环境搭建,Springboot项目,运行,接口验证)

一. 安装Java开发工具包&#xff08;JDK&#xff09;&#xff1a; 访问Java Software | OracleOracle官方网站&#xff0c;下载适合你操作系统的最新版本的JDK。安装JDK并设置好JAVA_HOME环境变量。 二. 安装集成开发环境&#xff08;IDE&#xff09;&#xff1a; 推荐使用In…

Appium+python自动化(二十八)- 高级滑动(超详解)

高级溜冰的滑动 滑动操作一般是两点之间的滑动&#xff0c;这种滑动在这里称其为低级的溜冰滑动&#xff1b;就是上一节给小伙伴们分享的。然而实际使用过程中用户可能要进行一些多点连续滑动操作。如九宫格滑动操作&#xff0c;连续拖动图片移动等场景。那么这种高级绚丽的溜…

word里的页码问题

一份文档写完&#xff0c;如果需要页码&#xff0c;第一页是封面&#xff0c;封面不需要页码怎么办&#xff1f; 解决&#xff1a;打开页眉页脚&#xff0c;然后把首页不同勾选上&#xff0c;这一页就没有页码了。 目录页&#xff0c;往往要使用罗马数字&#xff0c;其他正文又…

《遗留系统现代化》读书笔记(模式篇-代码现代化(一))

本文地址&#xff1a;http://t.csdn.cn/vS0Za 文章目录 代码现代化&#xff1a;你的代码可测吗&#xff1f;你的代码可测吗&#xff1f;标题如何让代码变得可测&#xff1f;接缝的位置接缝的类型新生和外覆为代码添加测试决策表模式测试的类型和组织遗留系统中的测试策略 代码…

【深度学习笔记】Softmax 回归

本专栏是网易云课堂人工智能课程《神经网络与深度学习》的学习笔记&#xff0c;视频由网易云课堂与 deeplearning.ai 联合出品&#xff0c;主讲人是吴恩达 Andrew Ng 教授。感兴趣的网友可以观看网易云课堂的视频进行深入学习&#xff0c;视频的链接如下&#xff1a; 神经网络和…

QuantMania!《快乐机器学习》和《Python 从入门到入迷》作者,FRM,CAIA

王的机器主理人 王圣元 (FRM, CAIA) 某加密货币公司 Head of Quant 冬海集团 SeaMoney 建模负责人 八方咨询 量化总监 新加坡国立大学金融数学硕士 新加坡国立大学量化金融学士 《快乐机器学习》的作者 《Python 从入门到入迷》的作者 第一本书 《快乐机器学习》 第二本书《Pyt…

MySQL 8.0详细安装配置教程

一. 前言 MySQL是目前最为流行的开源数据库产品&#xff0c;是完全网络化跨平台的关系型数据库系统。它起初是由瑞典MySQLAB公司开发&#xff0c;后来被Oracle公司收购&#xff0c;目前属于Oracle公司。因为开源&#xff0c;所以任何人都能从官网免费下载MySQL软件&#xff0c…

【4】-多个User执行测试

目录 一个locustfile中有多个User 使用--class-picker指定执行 小结 一个locustfile中有多个User from locust import task, HttpUserclass User01(HttpUser):weight 3 # 权重host https://www.baidu.comtaskdef user_01_task(self):self.client.get(url/, nameuser_01_…

echarts柱状图每根柱子添加警戒值/阈值,分段警戒线

需求&#xff1a;柱状图每根柱子都添加单独的警戒值&#xff08;黄色线部分&#xff09;&#xff0c;效果图如下&#xff1a; 实现方式我这有两种方案&#xff0c;如下介绍。 方案1&#xff1a;使用echarts的标线markLine实现&#xff08;ps&#xff1a;此种方案有弊端&#x…

小程序通过ip+port+路径获取服务器中的图片

配置IIS 首先需要配置IIS。 打开控制面板&#xff0c;接下来的流程按下图所示。 安装好后&#xff0c;按“win”键&#xff0c;搜索IIS 选择一个ip地址&#xff0c;或手动填写&#xff0c;端口号按需更改 填写别名和物理路径&#xff0c;别名就是后续通过url访问物理…

初步了解预训练语言模型BERT

本文字数&#xff1a;&#xff1a;4024字 预计阅读时间&#xff1a;12分钟 BERT是由Google提出的预训练语言模型&#xff0c;它基于transformer架构&#xff0c;被广泛应用于自然语言处理领域&#xff0c;是当前自然语言处理领域最流行的预训练模型之一。而了解BERT需要先了解注…

Mock-MOCO使用过程

一、jar包下载&#xff1a;https://github.com/dreamhead/moco 二、准备mock的json文件 data.json内容&#xff1a; ####GET请求 [{"description": "response使用Content-Type为charsetGBK编码格式来查看返回信息为中文的内容","request": {&q…

LeetCode101. 对称二叉树

101. 对称二叉树 一、题目 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例 1&#xff1a; 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true示例 2&#xff1a; 输入&#xff1a;root [1,2,2,null,3,null,3] 输出&#xff1a;false提示&am…

一百三十七、Hive——HQL运行报错(持续更新中)

一、timestamp字段与int字段相加 &#xff08;一&#xff09;场景 change_time字段是timestamp字段&#xff0c;代表一个红绿灯周期的开始时间&#xff08;先是绿灯、再是黄灯、最后红灯&#xff09;&#xff0c;而green是int字段&#xff0c;代表绿灯的秒数&#xff0c;现在…

Linux常用基础命令-------你想要的我都有❀

文章目录❀ ❀ls命令 ❀cd命令 ❀pwd命令 ❀date命令 ❀创建、删除文件和目录命令 ❀alias命令 ❀复制、移动、重命名、查看&#xff08;文件、目录&#xff09;命令 ❀find查找、wc统计命令 ❀vi/vim命令 1、打开文件 2、工作模式 vi与vim的四个模式 进入编辑模式…

Verilog语法学习——LV2_异步复位的串联T触发器

LV2_异步复位的串联T触发器 题目来源于牛客网 [牛客网在线编程_Verilog篇_Verilog快速入门 (nowcoder.com)](https://www.nowcoder.com/exam/oj?page1&tabVerilog篇&topicId301) 题目 题目描述&#xff1a; 用verilog实现两个串联的异步复位的T触发器的逻辑&#x…

MacOS本地安装Hadoop3

金翅大鹏盖世英&#xff0c;展翅金鹏盖世雄。 穿云燕子锡今鸽&#xff0c;踏雪无痕花云平。 ---------------- 本文密钥&#xff1a;338 ----------------- 本文描述了在macbook pro的macos上安装hadoop3的过程&#xff0c;也可以作为在任何类linux平台上安装hadoop3借鉴。 …

传染病模型

title: 传染病模型 date: 2023-7-24 10:55:00 updated: 2023-7-24 10:55:00 tags: 算法数学建模传染病模型matlab categories: 数学建模 传染病模型中的符号表示 SI模型&#xff08;艾滋传染模型&#xff09; %% 直接求微分方程的解析解 dsolve(Dx1 -0.1 * x1 * x2 / 1000, D…