啵啵啵啵啵啵啵啵啵啵啵啵啵啵啵

news2024/11/16 3:34:58

在这里插入图片描述

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C++、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和技术。关注公粽号 《机器和智能》 回复关键词 “python项目实战” 即可获取美哆商城视频资源!


博主介绍:
CSDN博客专家,CSDN优质创作者,CSDN实力新星,CSDN内容合伙人;
阿里云社区专家博主;
华为云社区云享专家;
51CTO社区入驻博主,掘金社区入驻博主,支付宝社区入驻博主,博客园博主。


C语言必备知识

    • 1. 什么是编程语言
    • 2. 程序和指令
    • 3. 计算机语言的发展
    • 4. CPU内部结构
    • 5. C语言应用领域
    • 6. 包含头文件
    • 7. main函数
    • 8. 代码块与作用域
    • 9. 代码行与注释
    • 10. main函数参数与返回值
    • 11. system函数
    • 12. C程序的编译过程
    • 13. 开发环境


专栏:《精通C语言》


1. 什么是编程语言

编程语言就是人和计算机交流的语言。

2. 程序和指令

指令是对计算机进行程序控制的最小单位,指令的集合构成指令系统。而程序则是为完成一项特定任务而用某种计算机语言编写的一组指令序列。
在这里插入图片描述

3. 计算机语言的发展

  • 计算机的组成
    在这里插入图片描述

  • 机器语言:在上面的计算机组成中可以看到,中央处理器CPU起着控制整个计算机运作的作用,而CPU都有一个指令系统,这个指令系统就是机器语言,机器语言是直接控制计算机硬件工作的语言,它是由0和1二进制数(由硬件电路决定,电平只有高低两种状态)组成的指令码,而这些指令码一般是由CPU厂商从生产CPU时就规定好的,不同型号的计算机其机器语言是互不相通的。

  • 汇编语言:机器语言是由计算机识别的0、1序列,应为计算机的硬件电路只有高电平和低电平两种状态。而对于人类来说,这些0、1序列显然是不可读的(没有人会喜欢看一堆0、1数字吧)。这时候就出现了汇编语言,汇编语言通过标识符来代替0、1序列,对人类来说是可读且易于理解的。但是,计算机只认识二进制的0和1,通过汇编语言是无法直接操作计算机硬件的。那么,如何把人类可读的汇编语言转换成计算机可读的二进制0、1序列呢?这就有了编译器,编译器是一段用来做翻译工作的程序,它既可以识别汇编语言又可以识别二进制机器语言,并且知道二者之间的对应关系。这样,通过编译器就可以把人类认识的汇编语言转换成计算机认识的机器语言了。

  • 高级语言:高级语言是更加通用和便捷的编程语言,通过高级语言,人们更加关注解决问题的逻辑和更高效的求解方式。高级语言有面向过程的C语言、面向对象的C++、Java、Python等。同样,高级语言也需要编译器来翻译为机器语言。实际上,编程语言没有高低之分,面向对象也并不一定就比面向过程高级,C语言一样可以实现面向对象编程,Linus这种顶级大佬不就是使用C语言写出了大名鼎鼎的Linux操作系统吗,而C++、Java、Python等面向对象语言的底层也都是由C语言实现的。

4. CPU内部结构

  • CPU的位数
    CPU内部最基本的存储单元是寄存器,CPU通过总线(地址、控制、数据)来和外部设备交互,总线的宽度是8位,同时CPU的寄存器也是8位,那么这个CPU就叫8位CPU。如果总线是32位,寄存器也是32位,那么这个CPU就是32位CPU。有一种CPU内部的寄存器是32位的,但总线是16位,这种叫做准32位CPU。所有的64位CPU兼容32位的指令,所以在64位的CPU上是可以识别32位的指令。在64位的CPU构架上运行了64位的软件操作系统,那么这个系统是64位,在64位的CPU构架上,运行了32位的软件操作系统,那么这个系统就是32位的,64位的软件不能运行在32位的CPU之上。
  • 寄存器、缓存、内存
    CPU工作时,先预先把要用的数据从硬盘读到内存,然后再把即将要用的数据读到寄存器。也就是说CPU和寄存器进行交互,寄存器和内存进行交互( CPU<—>寄存器<—>内存)。我们知道,操作寄存器的速度远远大于操作内存的速度,缓存是为了缓冲二者之间的速度差,如果总是操作内存中的同一址地的数据,每次都去内存取值,会严重影响速度,于是就在寄存器与内存之间设置一个缓存,从缓存提取数据的速度远高于内存(CPU<—>寄存器<—>缓存 <—> 内存)。

5. C语言应用领域

网站后台、服务器、编写其他语言、操作系统、驱动、嵌入式/物联网、数据库、编译器等等。

6. 包含头文件

头文件的作用

  • 通过头文件提供的接口调用库功能。对于源代码的提供者不能或不愿将源代码公布给用户的情况,用户需要通过头文件或动/静态链接库来调用功能。通过头文件提供的接口可以实现在隐藏底层实现逻辑的前提下向用户提供功能,而用户则在不关心接口实现逻辑的前提下可以调用库功能,根据头文件接口从库中寻找代码的任务由编译器完成。
  • 头文件增强了编译器的类型检查。在使用接口时需要按照头文件中声明的接口形式进行传参并接收返回值,如果调用实现和声明形式不一致会引起编译器报错。

引入头文件的两种方式

  • #include <>:将指定文件引入到当前文件,搜索策略为,直接在编译器指定的路径处开始搜索,如果找不到被引入文件,则程序报错。因此系统提供的头文件推荐使用这种方式引入。如果是集成开发环境,比如VS,这个默认路径一般在VS安装目录下的一个名为 include 的路径下。在Linux中,一般默认路径是 /usr/include 或 /usr/lib 下的目录。
  • #include “”:将指定文件引入到当前文件,搜索策略为,首先在运行程序所在的目录处进行搜索,搜索失败后再到编译器指定的路径处搜索,如果仍然搜索失败,则直接报错。因此,用户自定义头文件必须用这种方式引入,系统提供的头文件也可以使用这种方式,但是会增加没必要的搜索,所以不推荐。
     头文件中一般要加#ifndef/#define/#endif来防止重复包含
    在这里插入图片描述

7. main函数

一个完整的C语言程序,有且只能有一个main()函数(又称主函数)和若干个其他功能函数结合而成,main()函数是必须要有的,而其它功能函数则根据实际需要选择性添加。main函数是C语言程序的入口,程序是从main函数开始执行。

8. 代码块与作用域

{ }内部是一个代码块,也就是一个作用域,代码块执行完毕,作用域内的栈内存被自动释放。在编程时{ }中的每一半括号都应占据单独一行,并上下对齐,这不是C强制要求,而是一种编程规范。

9. 代码行与注释

  • 可执行语句必须由分号;结尾
  • 可执行语句必须在代码块{}内部(函数体内、作用域内)
  • #开头表示预编译指令,不需要分号;结尾
  • C语言只能以/**/注释,尽量不要以//注释
  • C++中使用//进行行注释,使用/**/进行代码块注释

10. main函数参数与返回值

return语句表示函数执行完毕,一般写main函数的时候,都应该定义为int类型返回值,即int main(int argc, char* argv[])。
实际上main函数也是有参数和返回值的,只不过我们在平时的学习中可能很少用到,main的返回值是int类型的,main函数的参数在Linux下编程用的还是比较多的。我们在运行一个可执行文件的时候可以在命令行传入参数给argv[],也就是说argv[]是用来存放我们在命令行传入的参数的,而参数argc用于统计参数的个数。不管我们传不传参数, argv[0]默认就是程序运行的路径名。也就是说argc最小为1(命令行不传参),argv[0]是程序运行路径。
在这里插入图片描述

11. system函数

  • 包含头文件:
    #include <stdlib.h>
  • 函数原型:
    int system(const char *command);
  • 函数功能:
    system() executes a command specified in command by calling /bin/sh -c command, and returns after the command has been completed. During execution of the command, SIGCHLD will be blocked, and SIGINT and SIGQUIT will be ignored. 该函数主要功能是在一个已经运行的程序中执行另一个程序。
  • 函数返回值:
    The value returned is -1 on error (e.g. fork(2) failed), and the return status of the command otherwise.
  • 函数的使用:
    在这里插入图片描述

在使用VS写程序的时候,如果你运行程序的时候,打印窗口一闪而逝,我们可以在main()函数的return语句前加一个system(“pause”); 来表示暂停。

12. C程序的编译过程

C代码编译成可执行程序经过4步:
1)预处理:宏定义展开、头文件展开、条件编译等,同时将代码中的注释删除,这里并不会检查语法。
2)编译:检查语法,将预处理后文件编译生成汇编文件。
3)汇编:将汇编文件生成目标文件(二进制文件)。
4)链接:C语言写的程序是需要依赖各种库的,所以编译之后还需要把库链接到最终的可执行程序中去。
在这里插入图片描述

GCC编译流程

选项含义
-E只进行预处理
-S(大写)只进行预处理和编译
-c(小写)只进行预处理、编译和汇编
-o file指定生成的输出文件名为 file

1) 预处理
在这里插入图片描述

如果不加重定向的话,默认会把预处理后的信息输出到标准输出,所以如果想要保留预处理后的程序,需要重定向到一个文件。可以看到预处理后的.i文件非常大,远远大于源文件,这是因为预处理进行了一系列的代码展开。
2) 编译
生成汇编代码
在这里插入图片描述

3) 汇编
在这里插入图片描述

4) 链接
生成可执行文件
在这里插入图片描述

在这里插入图片描述

13. 开发环境

本系列文章使用的开发环境及工具主要有:

  • Linux:VMware虚拟机、CentOS 6操作系统

  • Windows:Visual Studio 2019

  • 远程终端:SecureCRT

  • 远程编辑:UE编辑器

编写C语言程序,可以使用Linux下的vim编辑器,在Windows系统可以直接使用IDE集成开发环境编写,也可以使用各种编辑器编写,比如notepad++、UE编辑器等等。编写好的C程序必须经过编译器编译为二进制可执行代码才能运行,在Linux操作系统中可以直接通过gcc命令或者编写makefile脚本编译程序,在Windows操作系统可以使用IDE(集成了代码编辑器、编译器、调试器和图形用户界面工具)的编译功能直接编译。
注意:

  • Linux编译后的可执行程序只能在Linux运行,Windows编译后的程序只能在Windows下运行。
  • 64位的Linux编译后的程序只能在64位Linux下运行,32位Linux编译后的程序只能在32位的Linux运行。
  • 64位的Windows编译后的程序只能在64位Windows下运行,32位Windows编译后的程序可以在64位的Windows运行。

附:VS快捷键

VS快捷键含义
Ctrl + k,Ctrl + f自动格式化代码
Ctrl + k,Ctrl + c注释代码
Ctrl + k,Ctrl + u取消注释代码
F9设置断点
F5调试运行
Ctrl + F5不调试运行
Ctrl + Shift + b编译,不运行
F10next调试
F11step调试

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


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

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

相关文章

“安全生产月”专题报道:AI智能监控技术如何助力安全生产

今年6月是第23个全国“安全生产月”&#xff0c;6月16日为全国“安全宣传咨询日”。今年全国“安全生产月”活动主题为“人人讲安全、个个会应急——畅通生命通道”。近日&#xff0c;国务院安委会办公室、应急管理部对开展好2024年全国“安全生产月”活动作出安排部署。 随着科…

外贸自动化脚本编写会用到的源代码!

随着全球化的加速推进&#xff0c;外贸行业正迎来前所未有的发展机遇&#xff0c;为了提高工作效率、减少人为错误&#xff0c;并更好地把握市场机遇&#xff0c;越来越多的外贸企业开始关注自动化脚本的编写与应用。 自动化脚本不仅可以帮助企业实现业务流程的自动化&#xf…

python-windows10普通笔记本跑bert mrpc数据样例0.1.001

python-windows10普通笔记本跑bert mrpc数据样例0.1.000 背景参考章节获取数据下载bert模型下载bert代码windows10的cpu执行结果注意事项TODOLIST背景 看了介绍说可以在gpu或者tpu上去微调,当前没环境,所以先在windows10上跑一跑,看是否能顺利进行,目标就是训练的过程中没…

python面向过程与初始面向对象编程

让我们穿越到《龙珠》世界&#xff0c;一起揭开 面向对象编程 的神秘面纱吧。 面向过程编程与面向对象编程 天下第一武道会 选手登记 第 22 届天下第一武道会即将召开&#xff0c;各路武术高手齐聚一堂&#xff0c;其中最受瞩目的&#xff0c;当属卡卡罗特&#xff08;孙悟…

前后端实现文件上传进度条-实时进度

后端接口代码&#xff1a; PostMapping("/upload")public ResponseEntity<String> handleFileUpload(RequestParam("file") MultipartFile file) {try {// 获取文件名String fileName file.getOriginalFilename();// 创建上传目标路径Path targetPa…

CTFHUB-技能树-web-信息泄露

目录 1.目录遍历 2.PHPINFO 3.备份文件下载 3.1 网站源码 3.2 bak文件 3.3 vim缓存 3.4 .DS_Store 4.Git泄露 4.1 Log 4.2 Stash 4.3 Index 5.SVN泄露 6.HG泄露 1.目录遍历 这个没什么好讲的&#xff0c;进去直接点击找flag,然后在下面目录翻&#xff0c;就找到了 …

手撕设计模式——克隆对象之原型模式

1.业务需求 ​ 大家好&#xff0c;我是菠菜啊&#xff0c;前俩天有点忙&#xff0c;今天继续更新了。今天给大家介绍克隆对象——原型模式。老规矩&#xff0c;在介绍这期之前&#xff0c;我们先来看看这样的需求&#xff1a;《西游记》中每次孙悟空拔出一撮猴毛吹一下&#x…

无码高清?Stable DIffusion教程 | 如何利用 Stable Diffusion webui 将图片变得更清晰?全方位对比4种放大方法!

大家好&#xff0c;我是大师兄 1、引言 “高分放大”&#xff08;有时候也叫“超分放大”或“高清修复”&#xff09;描述了在确保图像清晰度的前提下提升图片分辨率的过程。例如&#xff0c;将一张512 x 512的图片放大四倍&#xff0c;得到的就是2048 x 2048分辨率的图片&am…

现代社区管理中的电瓶车违停检测技术

随着城市化进程的加快&#xff0c;电瓶车作为一种环保、便捷的出行工具在社区内的使用越来越普及。然而&#xff0c;电瓶车的随意停放问题也日益严重&#xff0c;影响了社区的整体环境和居民的生活质量。为了解决这一问题&#xff0c;社区管理者迫切需要一种高效、准确的电瓶车…

Qt:QDialogButtonBox的使用

QDialogButtonBox是Qt自带的按钮箱&#xff0c;通过枚举QDialogButtonBox::ButtonRole可以添加Qt定义按钮&#xff0c;或者通过方法QDialogButtonBox::addButton添加自定义的按钮。 // 自定义按钮。 button_box_ new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonB…

【Python报错】已解决SyntaxError: invalid character in identifier

成功解决“SyntaxError: invalid character in identifier”错误的全面指南 一、引言 在Python编程中&#xff0c;SyntaxError是一种常见的编程错误&#xff0c;它表明Python解释器在解析代码时遇到了不符合语法规则的情况。其中&#xff0c;“SyntaxError: invalid character…

vue3_组件间通信方式

目录 一、父子通信 1.父传子&#xff08; defineProps&#xff09; 2.父传子&#xff08;useAttrs&#xff09; 3.子传父&#xff08;ref&#xff0c;defineExpose &#xff09; 4.子传父&#xff08;defineEmits&#xff09; 5.子传父&#xff08;v-model&#xff09; …

OSI协议集

国际标准化组织除了定义osi参考模型之外&#xff0c;还开发了实现7个功能层次的各种协议和服务标准&#xff0c;这些协议和服务统称为osi协议。osi协议是一些已有的协议和iso新开发的协议的混合体&#xff0c;例如&#xff0c;大部分物理层和数据链路层协议是采用现有的协议&am…

数组中的第K个最大元素 ---- 分治-快排

题目链接 题目: 分析: 这道题很明显是一个top-K问题, 我们很容易想到用堆排序来解决, 堆排序的时间复杂度是O(N*logN), 不符合题意, 所以我们可以用另一种方法:快速选择算法, 他的时间复杂度为O(N)快速选择算法, 其实是基于快排, 进行修改而成, 我们还是使用将"将数组分…

QT treeWidget如何添加虚线

1、添加以下代码即可&#xff1a; ui.treeWidget->setStyle(QStyleFactory::create("windows"));2、效果如下&#xff1a;

Docker的网络管理

文章目录 一、Docker容器之间的通信1、直接互联&#xff08;默认Bridge网络&#xff09;1.1、Docker安装后默认的网络配置1.2、创建容器后的网络配置1.2.1、首先创建一个容器1.2.2、ip a 列出网卡变化信息1.2.3、查看新建容器后的桥接状态 1.3、容器内安装常见的工具1.4、容器间…

天才简史——Tamim Asfour与他的H²T实验室

一、Tamim Asfour介绍 Tamim Asfour为KIT人类学和机器人学研究所&#xff08;Institute for Anthropomatics and Robotics&#xff09;的全职教授&#xff0c;并担任高性能人形技术实验室 (High Performance Humanoid Technologies Lab&#xff0c;HT) 负责人。他目前的研究兴…

注册自定义材质实现qgis里不同比例尺下材质不被拉升的效果

前景提要&#xff1a; 在QGIS里的显示效果&#xff0c;用的是示例的/img/textures/line-interval.png材质图片。 下载示例 git clone https://gitee.com/marsgis/mars3d-vue-example.git 相关效果 比如材质是5像素&#xff0c;在1:100000万比例尺下&#xff0c;线显示的长…

一个月速刷leetcodeHOT100 day15 彻底搞懂回溯算法 以及相关题目

回溯算法采用试错的思想&#xff0c;它尝试分步的去解决一个问题。在分步解决问题的过程中&#xff0c;当它通过尝试发现现有的分步答案不能得到有效的正确的解答的时候&#xff0c;它将取消上一步甚至是上几步的计算&#xff0c;再通过其它的可能的分步解答再次尝试寻找问题的…

如何在MySQL中实现upsert:如果不存在则插入?

目录 1 使用 REPLACE 2 使用 INSERT ... ON DUPLICATE KEY UPDATE 使用 INSERT IGNORE 有效会导致 MySQL 在尝试执行语句时忽略执行错误 INSERT 。这意味着 包含 索引或 字段 INSERT IGNORE 中重复值的语句 不会 产生错误&#xff0c;而只是完全忽略该特定 命令。其明显目的是…