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

在这里插入图片描述

欢迎关注博主 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.mzph.cn/bicheng/24223.shtml

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

相关文章

通过U盘将第三方软件安装到各大品牌电视的方法

在本教程中&#xff0c;小武给大家整理了通过U盘的方式安装第三方软件到电视盒子上&#xff0c;可直接使用通用U盘的方式来进行安装。 如果您相应电视品牌按通用方式无法完成需求&#xff0c;下面为您也贴心整理了20款主流智能电视和电视盒子的U盘安装指南。这些步骤适用于小米…

GPT-4o:突出优势 和 应用场景

还是大剑师兰特&#xff1a;曾是美国某知名大学计算机专业研究生&#xff0c;现为航空航海领域高级前端工程师&#xff1b;CSDN知名博主&#xff0c;GIS领域优质创作者&#xff0c;深耕openlayers、leaflet、mapbox、cesium&#xff0c;canvas&#xff0c;webgl&#xff0c;ech…

2024世界人工智能大会青年优秀论文TOP20发布

作为 WAIC 2024 针对青年科学家的重要奖项&#xff0c;该奖项关注人工智能基础理论、数学基础、机器学习、计算机视觉与模式识别、自然语言处理等前沿领域。 2024 年 3 月&#xff0c;《关于推荐“2024 世界人工智能大会青年优秀论文奖”参评论文的通知》发布&#xff0c;面向…

【JVM】从编译后的指令集来再次理解++i和i++的执行顺序

JVM为什么要选用基于栈的指令集架构 与基于寄存器的指令集架构相比&#xff0c;基于栈的指令集架构不依赖于硬件&#xff0c;因此可移植性更好&#xff0c;跨平台性更好因为栈结构的特性&#xff0c;永远都是先处理栈顶的第一条指令&#xff0c;因此大部分指令都是零地址指令&…

利用keepalived对zabbix-server做高可用,部署安装keepalived

有2台机器&#xff0c;每台都有1个zabbix-server&#xff0c;然后再每台上再装一个keepalived https://www.keepalived.org/download.html 1&#xff0c;创建安装路径 mkdir /usr/share/keepalived/2&#xff0c;在这个安装路径下面下载keepalived的软件包 我选的版本是1.3…

Redis的事务与关系型数据库事务有何不同?

引言&#xff1a;关于 Redis 的事务很多人可能都是一知半解&#xff0c;大多数人只了解数据库的事务&#xff0c;并且是单体事务&#xff0c;对于 Redis 事务和常见关系型数据库的事务的区别还没有去了解过&#xff0c;本文就来详细进行介绍。 题目 Redis的事务与关系型数据库…

Go微服务: 基于使用场景理解分布式之二阶段提交

概述 二阶段提交&#xff08;Two-Phase Commit&#xff0c;2PC&#xff09;是一种分布式事务协议&#xff0c;用于在分布式系统中确保多个参与者的操作具有原子性即所有参与者要么全部提交事务&#xff0c;要么全部回滚事务&#xff0c;以维持数据的一致性它分为两个阶段进行&…

Towards Graph Contrastive Learning: A Survey and Beyond

目录 Towards Graph Contrastive Learning- A Survey and Beyond摘要IntroductionPRELIMINARY符号说明GNN对比学习下游任务 GCL自监督学习增强策略基于规则随机扰动或mask子图采样图扩散 基于学习图结构学习图对抗训练图合理化 对比模式同尺度对比全局上下文局部 跨尺度对比局部…

Polar Web【中等】写shell

Polar Web【中等】写shell Contents Polar Web【中等】写shell思路&探索EXP运行&总结 思路&探索 初看题目&#xff0c;预测需要对站点写入木马&#xff0c;具体操作需要在过程中逐步实现。 打开站点(见下图)&#xff0c;出现 file_put_contents 函数&#xff0c;其…

代码解读 | Hybrid Transformers for Music Source Separation[03]

一、背景 接着上一篇代码解读 | Hybrid Transformers for Music Source Separation[02]文章&#xff0c;继续对Hybrid Transformer Demucs 代码进行解读。 解读目标&#xff1a;明确数据从进入算法&#xff0c;在算法内部&#xff0c;以及在算法输出 这三个阶段中 数据的大小是…

pyqt 进度条QProgressBar

pyqt 进度条 QProgressBar效果代码 QProgressBar 在 PyQt 应用程序中&#xff0c;进度条&#xff08;通常称为 QProgressBar&#xff09;是一个用于显示任务进度的控件。它可以显示一个水平或垂直的条形图&#xff0c;条形图的长度会随着进度的增加而增加。 QProgressBar 的主…

分布式数据库架构:从单实例到分布式,开发人员需及早掌握?

现在互联网应用已经普及,数据量不断增大。对淘宝、美团、百度等互联网业务来说,传统单实例数据库很难支撑其性能和存储的要求,所以分布式架构得到了很大发展。而开发人员、项目经理,一定要认识到数据库技术正在经历一场较大的变革,及早掌握好分布式架构设计,帮助公司从古…

小米开放式耳机怎么样?倍思、西圣、小米开放式耳机测评比较!

作为一名热衷于分享真实体验的博主&#xff0c;我在过去两年开始接触开放式耳机&#xff0c;并因此受到许多朋友的咨询&#xff0c;询问哪款开放式耳机更加出色。为了找出最佳的开放式耳机&#xff0c;我进行了深入的调查和实地测试。我发现高价并不总是代表高质量&#xff0c;…

C++基础与深度解析 | 类与面向对象编程 | 数据成员 | 成员函数 | 访问限定符与友元 | 构造、析构成员函数 | 字面值类、成员指针与bind交互

文章目录 一、结构体与对象聚合二、成员函数&#xff08;方法&#xff09;三、访问限定符与友元1.访问限定符2.友元&#xff08;慎用&#xff09; 四、构造、析构与复制成员函数1.构造函数2.析构函数3.补充 五、字面值类&#xff0c;成员指针与bind交互1.字面值类2.成员指针3.b…

大小堆运用巧解数据流的中位数

​​​​​​​​​​ 一、思路 我们将所有数据平分成两份&#xff0c;前面那一部分用小堆来存&#xff0c;后面的部分用大堆来存&#xff0c;这样我们就能立刻拿到中间位置的值。 如果是奇数个数字&#xff0c;那么我们就将把中间值放在前面的大堆里&#xff0c;所以会有两种…

Windows取证分析 | 如何最大程度提升分析效率

本文由安全研究人员Amr Ashraf发表于Cyber5w的官方博客&#xff0c;研究人员在本文中讨论了如何对可疑设备中的内存映像进行安全调查&#xff0c;并利用了Volatility 3和MemProcFS来最大程度提升Windows取证分析的工作效率。 介绍 内存取证是任何计算机取证分析人员的必备技能…

如何给 MySQL 表和列授予权限?(官方版)

目录 授予表级别权限 授予列级别权限 如何给MySQL表和列授予权限是MySQL数据操作中非常重要的步骤&#xff0c;也是企业级使用MySQL数据库的起步点&#xff0c;以下分别参照官方教程整理的MySQL数据库的权限操作。 以下的语句可以直接使用MySQL的命令行进行操作&#xff08;如何…

3038. 相同分数的最大操作数目 I

题目 给你一个整数数组 nums&#xff0c;如果 nums 至少包含 2 个元素&#xff0c;你可以执行以下操作&#xff1a; 选择 nums 中的前两个元素并将它们删除。一次操作的分数是被删除元素的和。 在确保所有操作分数相同的前提下&#xff0c;请你求出最多能进行多少次操作。 …

排序数组 ---- 分治-归并

题目链接 题目: 分析: 用这道题来回顾一下归并排序的思想找到中间结点, 将数组分成两半, 运用递归的思想, 继续对一半进行分半, 分到最后剩一个元素, 再将左右数组合并, 合并两个有序数组, 是先分解, 再合并的过程在合并两个有序数组时, 需要一个额外的数组来记录, 为了避免每…

Unity DOTS技术(九) BufferElement动态缓冲区组件

文章目录 一.简介二.例子 一.简介 在之前的学习中我们发现Entity不能挂载相同的组件的. 当我们需要用相同的组件时则可以使用.IBufferElementData接口 动态缓冲区组件来实现 二.例子 1.创建IBufferElementData组件 using Unity.Entities; using UnityEngine; //[GenerateAu…